Я использую BOOST_PP для выполнения прекомпиляции вычислений в препроцессоре.Я сосредоточен на приложении, в котором размер кода чрезвычайно важен для меня.(Поэтому, пожалуйста, не говорите, что компилятор должен или , обычно , делает это, мне нужно контролировать, что выполняется во время компиляции и какой код генерируется).Однако я хочу иметь возможность использовать одно и то же имя макроса / функции как для целочисленных констант, так и для переменных.В качестве тривиального примера, у меня может быть
#define TWICE(n) BOOST_PP_MUL(n,2)
//.....
// somewhere else in code
int a = TWICE(5);
Это делает то, что я хочу, вычисляя
int a = 10;
во время компиляции.
Однако я также хочуэто будет использоваться в
int b = 5;
int a = TWICE(b);
Это должно быть предварительно обработано до
int b = 5;
int a = 5 * 2;
Конечно, я могу сделать это, используя традиционные макросы, такие как
#define TWICE(n) n * 2
Но тогда он не делает то, что я хочу, чтобы он делал для целочисленных констант (оценивая их во время компиляции).
Итак, у меня вопрос, есть ли хитрость, чтобы проверить, является ли аргумент литералом или переменной, а затем использовать другие определения.то есть что-то вроде этого:
#define TWICE(n) BOOST_PP_IF( _IS_CONSTANT(n), \
BOOST_PP_MUL(n,2), \
n * 2 )
edit: Итак, что мне действительно нужно, так это какой-то способ проверить, является ли что-то постоянным доступным во время компиляции, и, следовательно, хороший аргумент для функций BOOST_PP_.Я понимаю, что это отличается от того, что большинство людей ожидают от препроцессора и общих рекомендаций по программированию.Но не существует неправильного способа программирования, поэтому, пожалуйста, не ненавидьте этот вопрос, если вы не согласны с его философией.Существует причина, по которой библиотека BOOST_PP существует, и этот вопрос в том же духе.Возможно, это просто невозможно.