auto s = sizeof(+x);
должны сделать трюк для целых чисел.
+x
использует унарный оператор +
, который выполняет целочисленную рекламу, как и любой другой арифметический оператор.
Мне не известны никакие стандартные правила продвижения для float
, которые будут применяться здесь (в смысле цельной рекламы), поскольку вы можете сделать арифметику с ними без продвижения. Если вы всегда хотите продвигать, по крайней мере double
вы можете попробовать
auto s = sizeof(x + 0.);
, а затем различать между плавающей точкой и целыми числами, прежде чем попасть туда.
Опять же, я не думаю, что вы можете обрабатывать целые числа и плавающие точки сразу из-за разных значений «продвижения», которые мы применяем здесь.
Что именно ваш случай использования для этого? Это интересная проблема, я просто не знаю, для чего вы решили. – Borgleader
@Borgleader Я работаю над встроенным проектом (Cortex A5, и мы предпочли бы не превышать размер кода 256 тыс.). ОС имеет две функции (в широком смысле), реализованные в разных модулях: (1) printf (2) enqueue_stuff/dequeue_stuff. Позднее принимает переменное число uint32_t. Я хочу enqueue_stuff -> dequeue_stuff -> printf. –