You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在宏中定义内部宏以简化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);
};

关键说明

  1. 在BASE宏中,通过using __CURRENT_CLASS = CLASS;定义了类内部的类型别名,VALUE宏展开后处于类作用域内,可直接引用该别名获取当前类名。
  2. __CURRENT_CLASS仅在BASE包裹的类作用域内有效,不会污染全局命名空间。如果担心命名冲突,可以改用更独特的名称(比如_BASE_INNER_CURRENT_CLASS_)。

内容的提问来源于stack exchange,提问作者Brainiac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:58:15