Определить, имеет ли переменная арифметический тип
Есть ли способ определить, относится ли переменная к арифметическому типу или нет?
- арифметика: целые числа, числа с плавающей запятой, логические значения
- не арифметика: указатели, ссылки; например, строки и возможно все другие типы, определяемые реализацией и пользователем. Однако, если кто-то по какой-то причине определяет
typedef int myInt
,myInt
также следует считать арифметическим (потому что это так!)
В обычной программе на C++ я мог бы использовать std::is_arithmetic<T>::value
, где T
— тип, который мне нужно проверить, но это не так. похоже, он не работает в среде Arduino. (Я ошибаюсь? Если это работает, может кто-нибудь сказать мне, как его использовать?)
Я думаю, что мог бы составить список разрешенных типов, например, как описано в этом ответе на аналогичный вопрос (я имею в виду второй вариант , Альтернатива). Но учитывая, что мне не нужно точно знать тип T
, мне было интересно, есть ли более элегантное и гибкое решение...
@noearchimede, 👍2
Обсуждение1 ответ
Лучший ответ:
Есть ли способ определить, относится ли переменная к арифметическому типу или нет?
нет. в конце концов, это всего лишь фрагменты, и они имеют смысл только для компьютера в правильном контексте. Другими словами, одни и те же фрагменты могут и будут означать разные вещи в разных ситуациях.
Я знаю, что чтение 4 битов, представляющих число с плавающей запятой как длинное, даст действительное, но бессмысленное значение. Но компьютер должен каким-то образом знать, как интерпретировать эти биты, верно? Либо во время компиляции, либо во время выполнения тип каждой переменной/набора битов должен быть известен, и свойство арифметика/не арифметика также должно быть каким-то образом известно: разве я не получаю сообщение об ошибке, если пытаюсь выполнить myClass + aString
? (кстати, может ли это быть решением моей проблемы? Попробуйте выполнить некоторые арифметические действия с переменными , переданными вызывающей стороной, и вывести ошибку, если это невозможно сделать? Может ли это работать, и если да, что может быть ..., @noearchimede
...элегантная реализация? (Я имею в виду, что ошибка типа «невозможно выполнить myclass+astring» будет не очень понятно тому, кто не знает реализацию функции, которую он вызывает), @noearchimede
- Есть ли ограничения на размер массива в Arduino Mega 2560?
- Неожиданные результаты при создании 32-битного целого числа из массива байтов
- Int64_t, он же long long, действует как int32_t и переполняется на 2^31.
- Каковы размеры каждого примитивного типа данных в SAMD51 Metro M4 Express?
- Преобразование строки в целое число
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Как получить тип данных переменной?
Что вы *фактически* пытаетесь сделать?, @Majenko
Есть несколько портов стандартной библиотеки для Arduinos, но я не уверен, есть ли она у них. Вы можете просто посмотреть код и понять, как это делается, и портировать его самостоятельно., @Code Gorilla
Я упростил функцию, над которой работаю: template <typename T> bool myFunc (int a, T b) { если (a*b > 100) вернуть истину; } --- РЕДАКТИРОВАТЬ: извините, я забыл, что код не форматируется в комментариях... Надеюсь, он достаточно прост, чтобы его можно было прочитать., @noearchimede
@noearchimede В комментариях поместите код в обратные кавычки. Прочтите это для получения дополнительной информации: https://arduino.stackexchange.com/editing-help#comment-formatting, @Johnny Mopp
@Majenko На самом деле я пишу набор функций (в библиотеке), которые работают с арифметическими значениями, и нет смысла вызывать их с неарифметическими типами (это все равно что писать pow("two", "four" ).Однако, учитывая, что я использую библиотеку во многих разных проектах, а также другие люди будут использовать ее, я хотел бы иметь возможность ловить такие глупые ошибки (либо во время компиляции, либо во время выполнения, это не имеет значения (те все функции печатают текст, поэтому они могут напечатать «недопустимое число»)). Если я не могу этого сделать, я напишу длинный список перегруженных функций вместо использования шаблонов., @noearchimede
Хорошо, это имеет смысл. Для Arduino перегрузка кода, вероятно, является самым простым методом. Он используется во всем ядре для таких вещей, как
print()
и т. д. И вам нужно будет перегружать только те типы, которые вы действительно хотите обрабатывать, - тогда другие типы, которые не «складываются», вы просто получите ошибку компиляции., @MajenkoЯ не думаю, что Arduino IDE поддерживает логическую арифметику., @tuskiomi
Спасибо, я не думал об этом... но если есть совместимый с Arduino способ определить, имеет ли переменная арифметический тип, он не должен автоматически включать логическое значение, верно?, @noearchimede