如何在宏中定义内部宏以简化C++类代码编写?
用嵌套宏简化C++类定义代码
你需要把重复的类继承和成员变量定义代码通过宏简化,原始代码如下:
MyClass : public Base<MyClass> { Value<std::string> testString = value<std::string>(&MyClass::testString, "something"); // 更多类似的成员变量 }
希望简化为更简洁的写法:
BASE(MyClass) { VALUE(std::string, testString, "something"); }
核心解决思路是在BASE宏中定义类内部的类型别名,供VALUE宏直接引用当前类名,具体实现如下:
宏定义代码
// 先声明VALUE宏,避免BASE内部使用时未定义 #define VALUE(type, name, default) Value<type> name = value<type>(&__CURRENT_CLASS::name, default) #define BASE(CLASS) \ class CLASS : public Base<CLASS> { \ using __CURRENT_CLASS = CLASS; \ public: // 可选:用于闭合BASE宏的大括号,让写法更统一 #define END_BASE };
使用示例
方式一:配合END_BASE宏
BASE(MyClass) VALUE(std::string, testString, "something"); VALUE(int, testInt, 100); END_BASE
方式二:手动闭合大括号
BASE(MyClass) { VALUE(std::string, testString, "something"); VALUE(int, testInt, 100); };
关键说明
- 在
BASE宏中,通过using __CURRENT_CLASS = CLASS;定义了类内部的类型别名,VALUE宏展开后处于类作用域内,可直接引用该别名获取当前类名。 __CURRENT_CLASS仅在BASE包裹的类作用域内有效,不会污染全局命名空间。如果担心命名冲突,可以改用更独特的名称(比如_BASE_INNER_CURRENT_CLASS_)。
内容的提问来源于stack exchange,提问作者Brainiac
相关产品推荐
相关产品推荐

