带有升压预处理器的宏参数包

macro parameter pack with boost preprocessor

本文关键字:参数 处理器 预处理      更新时间:2023-10-16

我不知道有类似的问题。

如何简化

(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预处理器中是否有任何现成的解决方案。

我找不到比转换更好的折叠,因为 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)))

看到它活在Coliru

无需在此处使用预处理器。 variadic模板会很好。这是使用C 17 fold表达式的示例:

template <typename Needle, typename... Haystack>
bool my_check(const Needle& needle, const Haystack&... haystack)
{
    return ((needle == haystack) || ...);
}

wandbox上的实时示例