C++ 如何在C+中以不同的方式处理元组和单个标记+;预处理?

C++ 如何在C+中以不同的方式处理元组和单个标记+;预处理?,c++,macros,boost-preprocessor,C++,Macros,Boost Preprocessor,我想定义一个初始化(…)来实现以下功能 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

我想定义一个
初始化(…)
来实现以下功能

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
    }
};
struct MyStruct{
std::字符串a;
布尔b;
字符c;
双d;
void init(){
a=get_value();//使用get_value函数的返回值
b=true;//使用宏中的init值
c='$';//使用宏中的init值
d=get_value();//使用get_value函数的返回值
}
};
Boost\u PP
宏的帮助下是否可以实现这些目标


T get\u value()
是在库中定义的。

这几乎是可行的,在默认情况下初始化的东西周围需要一对额外的参数

 #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__)) }
编辑:正如@Quentin所建议的,您可以通过使用类似于的宏来去掉额外的括号。必要的改变是

#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__)) \
              ) \
                                                                          )
然后
初始化(a,(b,'a'),c)
也可以工作


<>编辑:一个更好的、不那么阻塞的语法是可能的,这取决于我们生成C++的确切结构。请参阅以获取灵感。

感谢您的反馈@n、 代词是m。我用一个具体的例子更新了这个问题。你可以让括号成为可选的。@Quentin nice,我不知道这是可能的。
#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__)) \
              ) \
                                                                          )