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

时间:2015-02-15 09:43:00

标签: 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的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构造。

1 个答案:

答案 0 :(得分:3)

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

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