2015-12-11 3 views
2

У меня есть следующий макрос:Заменить выражение по значению?

#define REFLECTABLE(...) \ 
REFLECTABLE_CONST(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)==0, __VA_ARGS__) 

Я выбежала предварительный процессор. Он переходит к REFLECTABLE_CONST3==0 вместо 0 или false. В REFLECTABLE_CONST я использую это значение для моделирования условного выражения, как описано в сообщении this. Итак, мне нужен предварительный процессор для передачи значения. Есть ли способ сделать предварительные процессоры такими, как 3==0, false или 0?

+0

Нет, препроцессор является механизмом замены текста. – molbdnilo

ответ

2

Я не мог воспроизвести BOOST_PP_VARIADIC_SIZE быть в состоянии иметь результат 0, но если вы можете, это должно работать:

#define IS_EMPTY_IMPL0 1 
#define IS_EMPTY_IMPL1 0 
#define IS_EMPTY_IMPL2 0 
#define IS_EMPTY_IMPL3 0 
#define IS_EMPTY_IMPL4 0 
#define IS_EMPTY_IMPL5 0 
#define IS_EMPTY_IMPL6 0 
#define IS_EMPTY_IMPL7 0 
#define IS_EMPTY_IMPL8 0 
#define IS_EMPTY_IMPL9 0 

#define IS_EMPTY(...) BOOST_PP_CAT(IS_EMPTY_IMPL, BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)) 

#define REFLECTABLE(...) \ 
REFLECTABLE_CONST(IS_EMPTY(__VA_ARGS__), __VA_ARGS__) 
+0

** Для будущего посетителя: ** Я принял этот ответ, потому что он обрабатывает вопрос как есть. Однако, см. Мой собственный ответ, который обеспечивает более простое решение реальной проблемы. – AlwaysLearning

2

Наткнулся на это решение. Просто используйте это вместо:

#define REFLECTABLE(...) \ 
REFLECTABLE_CONST(BOOST_PP_IS_EMPTY(__VA_ARGS__), __VA_ARGS__) 
+0

Этот макрос не задокументирован на веб-сайте Boost. – Simple

+0

@ Простой я тоже этого не нашел, но он работает :) – AlwaysLearning

+0

** Для будущего посетителя **: Посмотрите http://stackoverflow.com/a/34220519/2725810 для применения этого решения. – AlwaysLearning

Смежные вопросы