c++ - CRTP 层次类的非模板基类

标签 c++ templates

考虑以下带有 CRTP 的类层次结构:

template <class T> 
struct BaseClass {
    void foo_interface(int a) {
        static_cast<T*>(this)->foo(a);
    }
};

struct SubClass1 : public BaseClass<SubClass1> {
     void foo(int a) { std::cout << "SubClass1\n"; }
};

struct SubClass2 : public BaseClass<SubClass2> {
     void foo(int a) { std::cout << "SubClass2\n"; }
};

int main(int argc, char* argv[]) {

    BaseClass<SubClass1>* b1 = new SubClass1();
    BaseClass<SubClass2>* b2 = new SubClass2();

    b1->foo_interface(3); // Print "SubClass1"
    b2->foo_interface(4); // Print "SubClass2"

    delete b1;
    delete b2;
}

我需要创建一个 BaseClass 的父类(super class)以获得相同的行为,但采用以下方式(我必须迭代对象集合并调用此方法):

int main(int argc, char* argv[]) {

    SuperClass* b1 = new SubClass1();
    SuperClass* b2 = new SubClass2();

    b1->foo_interface(3); // Print "SubClass1"
    b2->foo_interface(4); // Print "SubClass2"

    delete b1;
    delete b2;
}

这可能吗?我不能使用虚拟方法,我尽量避免使用函数指针。方法 foo_interface 也可以在所有类之外定义。这些方法必须被调用很多次,因此出于性能原因我不能使用 switch/if 结构。

最佳答案

如果没有运行时分派(dispatch)(你已经禁止),你就不能拥有运行时接口(interface)。因此,你不可能为所欲为。如果你想要一个运行时接口(interface),你需要通过函数指针或虚函数进行运行时分派(dispatch)。

您还可以考虑将不同的子类放在不同的集合中。

关于c++ - CRTP 层次类的非模板基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524840/

相关文章:

c++ - 重载的模板参数 - 为什么这个例子有问题?

c++ - ImageMagick 使用 qt ans magick++ 打开和写入图像

c++ - 包括 .cpp 文件?

c++ - 我什么时候应该在现代 C++ 中使用(非头文件)源文件?

c++ - 可从多个文件和函数访问的类值 c++

C++ 模板作为模板的参数

C++ Template Linked List storing Class Objects - Unhandled Exception Access Violation 读取位置

c++ - NAT 上的 UDP 失败

c++ - 在 c++builder 中编译 c++ 的问题

c++ - 矩阵指数与 Armadillo