带升压预处理器的宏参数包
macro parameter pack with 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预处理器有现成的解决方案吗
这里不需要使用预处理器。 可变参数模板 就可以了。这是一个使用 C++17 折叠表达式 :
的示例
template <typename Needle, typename... Haystack>
bool my_check(const Needle& needle, const Haystack&... haystack)
{
return ((needle == haystack) || ...);
}
我找不到比变换后跟折叠更好的方法了,因为 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)))
不知道有没有类似问题
如何简化
(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预处理器有现成的解决方案吗
这里不需要使用预处理器。 可变参数模板 就可以了。这是一个使用 C++17 折叠表达式 :
的示例template <typename Needle, typename... Haystack>
bool my_check(const Needle& needle, const Haystack&... haystack)
{
return ((needle == haystack) || ...);
}
我找不到比变换后跟折叠更好的方法了,因为 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)))