是否可以连接可变宏的参数以形成变量名?
Is it possible to concatenate parameters of variadic macro to form a variable name?
我正在努力实现如下目标:
#define def_name(delim, ...) ??? // how will this variadic macro concatenate its parameters to define a new variable?
// Calling `def_name` as follows should define a new variable.
def_name("_", "abc", "def", "ghi");
// The following code should be generated after invoking the above macro.
inline constexpr char const abc_def_ghi_name[]{"abc_def_ghi"};
// Invoking the macro as:
def_name("", "abc", "def", "ghi");
// should produce the following code:
inline constexpr char const abcdefghi_name[]{"abcdefghi"};
def_name
宏应该是什么来支持上述用例?此外,是否可以在编译时使用 C++ templates/constexpr?
实现类似的功能
几乎没有语法更改(MACRO 可以字符串化,但不能取消字符串化),您的用法可能是:
def_name(, a, b)
def_name(_, a, b, c)
你可能会这样做,有一些上限:
#define def_name1(sep, p1) \
inline constexpr char const p1##_name[]{#p1};
#define def_name2(sep, p1, p2) \
inline constexpr char const p1##sep##p2##_name[]{#p1 #sep #p2};
#define def_name3(sep, p1, p2, p3) \
inline constexpr char const p1##sep##p2##sep##p3##_name[]{#p1 #sep #p2 #sep #p3};
// ...
并派遣到正确的,一些公用事业:
#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
#define COUNT(...) COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
// Warning: COUNT() return 1 (as COUNT(A)) :-/
#define IDENTITY(N) N
#define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))
最后
#define DISPATCH(N) def_name ## N
#define def_name(sep, ...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(sep, __VA_ARGS__)
我正在努力实现如下目标:
#define def_name(delim, ...) ??? // how will this variadic macro concatenate its parameters to define a new variable?
// Calling `def_name` as follows should define a new variable.
def_name("_", "abc", "def", "ghi");
// The following code should be generated after invoking the above macro.
inline constexpr char const abc_def_ghi_name[]{"abc_def_ghi"};
// Invoking the macro as:
def_name("", "abc", "def", "ghi");
// should produce the following code:
inline constexpr char const abcdefghi_name[]{"abcdefghi"};
def_name
宏应该是什么来支持上述用例?此外,是否可以在编译时使用 C++ templates/constexpr?
几乎没有语法更改(MACRO 可以字符串化,但不能取消字符串化),您的用法可能是:
def_name(, a, b)
def_name(_, a, b, c)
你可能会这样做,有一些上限:
#define def_name1(sep, p1) \
inline constexpr char const p1##_name[]{#p1};
#define def_name2(sep, p1, p2) \
inline constexpr char const p1##sep##p2##_name[]{#p1 #sep #p2};
#define def_name3(sep, p1, p2, p3) \
inline constexpr char const p1##sep##p2##sep##p3##_name[]{#p1 #sep #p2 #sep #p3};
// ...
并派遣到正确的,一些公用事业:
#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
#define COUNT(...) COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
// Warning: COUNT() return 1 (as COUNT(A)) :-/
#define IDENTITY(N) N
#define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))
最后
#define DISPATCH(N) def_name ## N
#define def_name(sep, ...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(sep, __VA_ARGS__)