我想写一个有一个参数的宏,并将这个参数添加到一个枚举中,并创建一个同名的类。在 C++ 中可能吗?如果是,比如何?
为了更清楚这里是我想做的一个例子:
我这样调用宏:
REGISTER(A);
REGISTER(B);
REGISTER(C);
或者像这样调用宏:
REGISTER(A, B, C);
我想让预处理器生成这样的代码:
enum X { E_A, E_B, E_C };
class A {};
class B {};
class C {};
最佳答案
这样的事情可能会有所帮助:
#define FE_1(WHAT, X) WHAT(X)
#define FE_2(WHAT, X, ...) WHAT(X)FE_1(WHAT, __VA_ARGS__)
#define FE_3(WHAT, X, ...) WHAT(X)FE_2(WHAT, __VA_ARGS__)
#define FE_4(WHAT, X, ...) WHAT(X)FE_3(WHAT, __VA_ARGS__)
#define FE_5(WHAT, X, ...) WHAT(X)FE_4(WHAT, __VA_ARGS__)
//... repeat as needed
#define GET_MACRO(_1,_2,_3,_4,_5,NAME,...) NAME
#define FOR_EACH(action,...) \
GET_MACRO(__VA_ARGS__,FE_5,FE_4,FE_3,FE_2,FE_1)(action,__VA_ARGS__)
#define REGISTER_ENUM_VALUE(X) E_##X,
#define REGISTER_ENUM(...) enum X { FOR_EACH(REGISTER_ENUM_VALUE, __VA_ARGS__) }
#define REGISTER_CLASS(X) ; class X {}
#define REGISTER(...) REGISTER_ENUM(__VA_ARGS__) FOR_EACH(REGISTER_CLASS, __VA_ARGS__)
REGISTER(A, B, C);
请注意,您无法获得真正的可变参数 FOR_EACH,它将始终限制在您计划的和手动实现的某个最大参数量内。至少还没有人找到解决方法:)
致谢:从 here 中“窃取”了一些代码.
关于c++ - 用一个宏创建两个不同的代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23373740/