带有boost预处理器的宏参数包

时间:2018-02-14 16:12:00

标签: c++ c++03 boost-preprocessor

我不知道是否有类似的问题。

如何简化

(a == 78 || a == 98 || a == 73 || a == 11 || a == 90 || a==103 || a==45 )

表达到

MY_CHECK(a, (78, 98, 73, 11, 90, 103, 45) )

使用boost预处理器??
在boost预处理器中是否有任何现成的解决方案。

2 个答案:

答案 0 :(得分:0)

此处无需使用预处理器。一个可变参数模板就可以了。以下是使用C ++ 17 折叠表达式的示例:

everything

live example on wandbox

答案 1 :(得分:0)

由于BOOST_PP_SEQ_FOLD_LEFT周围没有data参数,因此我找不到转换后跟折叠的效果。仍然:

#define MY_CHECK_FOLD_OR(s, a, b) a || b
#define MY_CHECK_FOLD_EQ(s, var, elem) (var) == (elem)

#define MY_CHECK(var, values)             \
    (BOOST_PP_SEQ_FOLD_LEFT(              \
        MY_CHECK_FOLD_OR, false,          \
        BOOST_PP_SEQ_TRANSFORM(           \
            MY_CHECK_FOLD_EQ, var,        \
            BOOST_PP_TUPLE_TO_SEQ(values) \
        )                                 \
    ))

...扩展了:

if (MY_CHECK(a, (1, 2, 3)))

...进入:

if ((false || (a) == (1) || (a) == (2) || (a) == (3)))

See it live on Coliru