用一个宏创建两个不同的代码块
Create two different code block with one macro
我想写一个有一个参数的宏,并将这个参数添加到枚举中,然后创建一个同名的类。这在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,它将始终被限制为您正在计划和手动执行的某个最大参数量。至少还没有人找到绕过它的方法:(
实时示例
鸣谢:一些代码从这里"被盗"。
相关文章:
- 我希望定义两个具有相同代码的不同名称的库
- 计算两个代码块的时间复杂度
- 这两个代码片段相似,但显示的结果不同
- 在Qt/C++中从一个代码构建两个略有不同的项目
- 为什么这两个版本的代码给出不同的输出
- 无法理解代码背后的逻辑,这是在两个给定数字之间生成素数的优化问题
- 如何将两个代码组合成一个函数?
- 为什么 valgrind 报告两个内存分配,而我的代码只请求一个?
- 为什么要更改这两个代码的输出"&"字符?
- 无法使用两个包装不同下一层的ssl_stream编译代码
- 以下两个代码段有什么区别?
- 两个代码段之间有什么区别?
- 为什么这两个相似的代码计算行列式的结果不同?
- Python 等效代码,可像C++一样直接附加两个整数
- 给定的两个代码有什么区别.一个在 ideone 上运行时超出时间限制,另一个工作正常
- 为什么这两个代码片段具有相同的效果?
- 为什么这两个代码给出不同的输出?// bits.c float_i2f
- 在"C++代码"部分中,可能会写入两个字节
- 在两个派生类之间执行专用代码
- 维护/维持两个代码集的风险,一个用于 CPU,一个用于 GPU,需要执行非常相似的功能