c++ - 在没有反射/内省(introspection)的情况下确定 C++ 中的类类型

标签 c++ templates types static

我有一个名为 A 的接口(interface)类和两个实现 A 的基类 B 和 C。在我的代码中,有时我需要确定一个实例是 B 还是 C,我宁愿没有本地非静态成员A 确定实现类是 B 型还是 C 型。出于性能原因,我也不想使用 dynamic_cast 或其他形式的反射来确定它们的类型。

是否建议为 A 创建一个基类 AA,它接受一个 int 类型的模板参数,并使用该值来确定 B 或 C 的类型?

或者在 A 中定义一个返回枚举类型的静态方法如何,该方法被 B 和 C 中的类似方法所掩盖?

最佳答案

您是否试图在一般情况下避免虚函数?在这种情况下,您可以将该功能添加到 A 本身:

struct A {
    enum ClassType { ClassTypeB, ClassTypeC };
    const ClassType mClassType;

    ClassType classType() const
    { return mClassType; }

protected:
    A(ClassType type) : mClassType(type) { }
};

然后在子类中,您将使用类似以下内容初始化 A:

struct B: public A {
    B() : A(ClassTypeB) { }
};

struct C: public A {
    C() : A(ClassTypeC) { }
};

// ...

A* obj1 = new B;
A* obj2 = new C;
obj1->classType() == A::ClassTypeB; // true
obj2->classType() == A::ClassTypeC; // true

这可以让您避免任何虚方法分派(dispatch),但缺点是 A 现在必须了解其子类。

关于c++ - 在没有反射/内省(introspection)的情况下确定 C++ 中的类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616523/

相关文章:

c++ - 散列函数中质数的使用分析

c++ - 不允许使用非成员函数重载 C++ 转换运算符的理由是什么

c++ - std::basic_string 作为函数模板的参数不能从 const char* 推导出

html - 更改 Sphinx 的目录模板

types - double float 是如何存储和计算的?

c++ - 将 "ddd"附加到远程计算机上运行的进程

c++ - 从文件中删除记录 C++

javascript - knockout 模板绑定(bind)不更新 UI

java - 整数最小值和最大值

types - OCaml 在不相交的联合中有记录语法吗?