繁体   English   中英

CRTP层级类的非模板基类

[英]Non-template base class for CRTP hierarcy class

考虑以下带有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的超类来获得相同的行为,但是要采用以下方式(我必须遍历对象的集合并调用此方法):

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

没有运行时调度(您已禁止),就不能有运行时界面。 因此,您不可能做自己想做的事情。 如果需要运行时接口,则需要通过诸如函数指针或虚拟函数的运行时调度。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM