Второй параметр BOOST_PP_LIST_AT
принимает индекс / целое число. Он работает с хитрыми взломами препроцессоров под капотом. Параметр (расширенный) должен быть точно целочисленным литералом, а не целым числом в круглых скобках. MY_INDEX_FUNCTION
следует изменить, чтобы параметр, передаваемый в BOOST_PP_LIST_AT
, был буквально целочисленным литералом:
#define MY_INDEX_FUNCTION(x) x
Макрос не работает с арифметическими выражениями, это не будет работать:
#define MY_INDEX_FUNCTION(x) (x+1)
NOR
#define MY_INDEX_FUNCTION(x) x+1
Но вы можете сделать это с
#define MY_INDEX_FUNCTION(x) MY_INDEX_FUNCTION_ ## x
#define MY_INDEX_FUNCTION_0 1
#define MY_INDEX_FUNCTION_1 2
#define MY_INDEX_FUNCTION_2 3
//...
Это макроопределение может быть создано скриптом (python-)
def my_index_function(x):
# insert the behavior of the macro here
return x+1
MACRO_NAME = "MY_INDEX_FUNCTION"
INDEX_MAX = 255
for x in range(INDEX_MAX):
print("#define %s_%i %i" % (
MACRO_NAME,
x,
my_index_function(x),
))
print("#define %s(x) %s_ ## x" % (
MACRO_NAME,
MACRO_NAME,
))