【问题标题】:macro parameter pack with boost preprocessor带有 boost 预处理器的宏参数包
【发布时间】:2018-02-14 16:12:00
【问题描述】:

不知道有没有类似的问题。

如何简化

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

【问题讨论】:

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


    【解决方案1】:

    我找不到比转换后跟折叠更好的方法了,因为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

    【讨论】:

      【解决方案2】:

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

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

      live example on wandbox

      【讨论】:

      • 谢谢,但我只使用 c++03。 [c++03] 已添加。
      • 我以为 c++ 标签的意思是旧的 c++03 )),抱歉​​。
      • 现在是 2018 年 @KhurshidNormuradov,你甚至不应该使用 C++03。您至少应该使用 C++11。
      • 我为旧服务器编写代码。我喜欢 c++11,c++14,当然。
      猜你喜欢
      • 2014-10-01
      • 2011-05-14
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      相关资源
      最近更新 更多