可以用模板替换类类型信息宏吗?

达伦

我有一个传统的大类继承树(域类),它实现了它自己的类类型信息和注册表。这样做的方式是每个类都“调用”一个像这样的宏

class MyClass : public MyParent {
  MY_DECLARE_DYNAMIC(MyClass)

  ...
};

//in .c file:
MY_IMPLEMENT_DYNAMIC(MyClass, MyParent)

基本上这些宏插入了一个静态函数,它是一个 meyer 的单例,返回一个指向MyClassInfo的指针,如下所示:

class MyClass : public MyParent {
    MyClassInfo* GetClassInfo_() {
      static MyClassInfo instance=...;
      return &instance;
    }

    virtual MyClassInfo* GetClassInfo() const;
};

宏插入的另一件事是一个虚函数,用于检索类信息以供运行时使用(即,从某个基类型指针)。

MyClassInfo* 保存类的字符串名称和获取父类信息的某种方式(实现当前为此使用函数指针)。

现在可以通过直接写入来使用此信息:MyClass::GetClassInfo_()myClass.GetClassInfo()

在实际情况中,有(您可能已经猜到)更多细节,但我认为这足以说明这个概念,只是说每个类都可以有更多的特征,如数据(例如,一个枚举值指示这是否特定类已弃用)

这种模式在 WxWidgets 和 MFC https://docs.microsoft.com/en-us/previous-versions/ywz9k63y(v=vs.140) 中也是众所周知的

有没有人有摆脱这些宏的解决方案?除了手工编写所有内容 - 例如使用模板或虚拟继承等。最好是不增加每个对象的大小(不仅仅是一个虚拟函数)。

坦率

使代码更好的一种合理且简单的方法是将 的静态实例MyClassInfo完全移出类,并使其成为模板化函数:

这是一个完整的例子:

#include <type_traits>

class MyClassInfo {
public:
    virtual ~MyClassInfo() {}
    virtual MyClassInfo* get_parent() const = 0; 
};

template<typename T>
MyClassInfo* get_class_info();

template<typename T>
class MyClassInfo_impl : public MyClassInfo {
public:
    using parent_t = typename T::parent_t;
    MyClassInfo* get_parent() const override {
        if constexpr(std::is_same_v<parent_t, void>) {
            return nullptr;
        }
        else {
          return get_class_info<parent_t>();
        }
    }
};

template<typename T>
MyClassInfo* get_class_info() {
    static MyClassInfo_impl<T> impl;
    return &impl;
}

class Parent {
public:
    // Could probably be inferred through SFINAE instead.
    using parent_t = void;
};

class MyClass : public Parent {
public:
    using parent_t = Parent;
    virtual MyClassInfo* GetClassInfo() { 
      return get_class_info<MyClass>();
    } 
};

int main() {
    auto class_info = get_class_info<MyClass>();
}

这样,您只剩下虚函数,正如您在评论中提到的那样,处理任何基于继承的解决方案变得非常混乱。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以用C ++中的非模板类“包装”模板类吗?

来自分类Dev

用模板替换类定义宏

来自分类Dev

我可以用此类中的嵌套类填充模板参数吗?

来自分类Dev

我可以用类型替换SLAB每事件一个方法吗?

来自分类Dev

我可以用密码保护Excel宏吗?

来自分类Dev

可以用 compose 键获得带有宏的 æ 吗?

来自分类Dev

python类中的方法可以用子类定义的类型注释吗?

来自分类Dev

现在可以用JavaScript替换AppleScript吗?

来自分类Dev

EXE总是可以用COM替换吗?

来自分类Dev

我可以用JUnit失败原因替换变量吗?

来自分类Dev

我们可以用C#中的带有默认方法的接口替换抽象类吗

来自分类Dev

Jena RdfDataMgr可以用类型文字写乌龟吗

来自分类Dev

匿名类可以用 lambda 代替吗?

来自分类Dev

我可以为模板类的模板类型添加参数吗

来自分类Dev

用这段用C语言编写的代码可以用来替换if语句吗?

来自分类Dev

是否可以用 $ 替换括号?

来自分类Dev

我可以用双精度类型初始化float类型的变量吗?

来自分类Dev

我可以用html和css创建菜单模板吗

来自分类Dev

我们可以用具有扩展方法的接口替换抽象类吗?

来自分类Dev

我们可以用具有扩展方法的接口替换抽象类吗?

来自分类Dev

在Typescript中声明对象类型时,我可以用“ any”替换什么?

来自分类Dev

CRTP 静态多态性:是否可以用模拟替换基类?

来自分类Dev

我可以用视图参数替换非常复杂的SQL Select吗?

来自分类Dev

可以用单个s ///指定迭代替换过程吗?

来自分类Dev

我可以用_lodash替换angular.copy,这样会更有效吗?

来自分类Dev

我可以用注释替换pretty-config.xml配置吗

来自分类Dev

可以用环境变量替换Maven -D系统属性吗?

来自分类Dev

.pkg可以用其他名称替换应用程序捆绑包吗?

来自分类Dev

我可以用mysqli_盲目替换所有mysql_函数吗?

Related 相关文章

  1. 1

    我们可以用C ++中的非模板类“包装”模板类吗?

  2. 2

    用模板替换类定义宏

  3. 3

    我可以用此类中的嵌套类填充模板参数吗?

  4. 4

    我可以用类型替换SLAB每事件一个方法吗?

  5. 5

    我可以用密码保护Excel宏吗?

  6. 6

    可以用 compose 键获得带有宏的 æ 吗?

  7. 7

    python类中的方法可以用子类定义的类型注释吗?

  8. 8

    现在可以用JavaScript替换AppleScript吗?

  9. 9

    EXE总是可以用COM替换吗?

  10. 10

    我可以用JUnit失败原因替换变量吗?

  11. 11

    我们可以用C#中的带有默认方法的接口替换抽象类吗

  12. 12

    Jena RdfDataMgr可以用类型文字写乌龟吗

  13. 13

    匿名类可以用 lambda 代替吗?

  14. 14

    我可以为模板类的模板类型添加参数吗

  15. 15

    用这段用C语言编写的代码可以用来替换if语句吗?

  16. 16

    是否可以用 $ 替换括号?

  17. 17

    我可以用双精度类型初始化float类型的变量吗?

  18. 18

    我可以用html和css创建菜单模板吗

  19. 19

    我们可以用具有扩展方法的接口替换抽象类吗?

  20. 20

    我们可以用具有扩展方法的接口替换抽象类吗?

  21. 21

    在Typescript中声明对象类型时,我可以用“ any”替换什么?

  22. 22

    CRTP 静态多态性:是否可以用模拟替换基类?

  23. 23

    我可以用视图参数替换非常复杂的SQL Select吗?

  24. 24

    可以用单个s ///指定迭代替换过程吗?

  25. 25

    我可以用_lodash替换angular.copy,这样会更有效吗?

  26. 26

    我可以用注释替换pretty-config.xml配置吗

  27. 27

    可以用环境变量替换Maven -D系统属性吗?

  28. 28

    .pkg可以用其他名称替换应用程序捆绑包吗?

  29. 29

    我可以用mysqli_盲目替换所有mysql_函数吗?

热门标签

归档