Определить, имеет ли переменная арифметический тип

Есть ли способ определить, относится ли переменная к арифметическому типу или нет?

  • арифметика: целые числа, числа с плавающей запятой, логические значения
  • не арифметика: указатели, ссылки; например, строки и возможно все другие типы, определяемые реализацией и пользователем. Однако, если кто-то по какой-то причине определяет typedef int myInt, myInt также следует считать арифметическим (потому что это так!)

В обычной программе на C++ я мог бы использовать std::is_arithmetic<T>::value, где T — тип, который мне нужно проверить, но это не так. похоже, он не работает в среде Arduino. (Я ошибаюсь? Если это работает, может кто-нибудь сказать мне, как его использовать?)

Я думаю, что мог бы составить список разрешенных типов, например, как описано в этом ответе на аналогичный вопрос (я имею в виду второй вариант , Альтернатива). Но учитывая, что мне не нужно точно знать тип T, мне было интересно, есть ли более элегантное и гибкое решение...

, 👍2

Обсуждение

Что вы *фактически* пытаетесь сделать?, @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


1 ответ


Лучший ответ:

1

Есть ли способ определить, относится ли переменная к арифметическому типу или нет?

нет. в конце концов, это всего лишь фрагменты, и они имеют смысл только для компьютера в правильном контексте. Другими словами, одни и те же фрагменты могут и будут означать разные вещи в разных ситуациях.

,

Я знаю, что чтение 4 битов, представляющих число с плавающей запятой как длинное, даст действительное, но бессмысленное значение. Но компьютер должен каким-то образом знать, как интерпретировать эти биты, верно? Либо во время компиляции, либо во время выполнения тип каждой переменной/набора битов должен быть известен, и свойство арифметика/не арифметика также должно быть каким-то образом известно: разве я не получаю сообщение об ошибке, если пытаюсь выполнить myClass + aString ? (кстати, может ли это быть решением моей проблемы? Попробуйте выполнить некоторые арифметические действия с переменными , переданными вызывающей стороной, и вывести ошибку, если это невозможно сделать? Может ли это работать, и если да, что может быть ..., @noearchimede

...элегантная реализация? (Я имею в виду, что ошибка типа «невозможно выполнить myclass+astring» будет не очень понятно тому, кто не знает реализацию функции, которую он вызывает), @noearchimede