CRTP层次结构类的非模板基类

Non-template base class for CRTP hierarcy class

本文关键字:基类 层次结构 CRTP      更新时间:2023-10-16

考虑以下具有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 << "SubClass1n"; }
};
struct SubClass2 : public BaseClass<SubClass2> {
     void foo(int a) { std::cout << "SubClass2n"; }
};
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;
}

我需要创建一个基类的SuperClass来获得相同的行为,但方式如下(我必须迭代对象的集合并调用此方法):

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构造。

如果没有运行时调度(您已经禁止了),就无法拥有运行时接口。因此,你不可能做你想做的事。如果您想要一个运行时接口,您需要通过函数指针或虚拟函数进行运行时调度。

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