【问题标题】:How to handle tuples and single tokens differently in C++ preprocessing?如何在 C++ 预处理中以不同方式处理元组和单个标记?
【发布时间】:2020-07-22 17:17:55
【问题描述】:

我想定义一个INITIALIZE(...) 来实现以下目标

struct MyStruct {
    std::string a;
    bool b;
    char c;
    double d;
    INITIALIZE(a, (b, true), (c, '$'), d);
};

扩展为

struct MyStruct {
    std::string a;
    bool b;
    char c;
    double d;

    void init() {
        a = get_value<std::string>();  // use return value of get_value function
        b = true;                      // use init value from the macro
        c = '$';                       // use init value from the macro
        d = get_value<double>();       // use return value of get_value function
    }
};

这些可以在Boost_PP 宏的帮助下实现吗?

T get_value&lt;T&gt;() 在库中定义。

【问题讨论】:

  • 感谢您的反馈。 @n.'代词'm。我已经用一个具体的例子更新了这个问题。

标签: c++ macros boost-preprocessor


【解决方案1】:

这几乎是可行的,您需要在默认初始化的事物周围添加一对额外的括号。

 #define INIT_1(x) x = get_value<decltype(x)>();
 #define INIT_2(x, y) x = y;
 #define INIT_ONE(...) BOOST_PP_CAT(INIT_, \
                           BOOST_PP_VARIADIC_SIZE(__VA_ARGS__))(__VA_ARGS__)
 #define INIT_ONE_X(r, data, elem) INIT_ONE elem
 #define INITIALIZE(...) void init () { BOOST_PP_SEQ_FOR_EACH( \
                           INIT_ONE_X, x, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) }

现在INITIALIZE((a), (b, 'a'), (c)) 扩展为

void init () { a = get_value<decltype(a)>(); b = 'a'; c = get_value<decltype(c)>(); }

编辑:正如@Quentin 所建议的,您可以使用类似于this 的宏来去掉多余的括号。必要的改变是

#define INIT_ONE_XX(elem)  INIT_ONE elem
#define INIT_ONE_X(r, data, elem) INIT_ONE_XX(ENSURE_PARENS(elem))

#define ENSURE_PARENS(...) \
  BOOST_PP_REMOVE_PARENS( \
          BOOST_PP_IF( \
              BOOST_PP_IS_BEGIN_PARENS(__VA_ARGS__), \
              (__VA_ARGS__), \
              ((__VA_ARGS__)) \
              ) \
                                                                          )

那么INITIALIZE(a, (b, 'a'), c) 也可以。

编辑:根据我们生成的确切 C++ 构造,可能会有更好、更少阻碍的语法。请参阅http://aantron.github.io/better-enums/ 获取灵感。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多