【问题标题】:Non-template base class for CRTP hierarcy classCRTP 层次类的非模板基类
【发布时间】:2015-02-15 09:42:59
【问题描述】:

考虑以下带有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 构造。

【问题讨论】:

  • CRTP的T是模板。至少可以说,尝试在没有模板的情况下做 CRTP 所做的事情是不干净的。
  • 我正在寻找该问题的解决方案,CRTP 不是强制性的。
  • “我不能使用虚拟方法”为什么
  • 我必须使用 CUDA。我必须在主机中创建类。
  • SuperClass 必须有一个虚拟析构函数,否则你在main 中的delete 是UB。

标签: c++ templates


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2020-01-16
    • 2021-03-30
    • 2019-11-09
    • 1970-01-01
    • 2014-03-13
    • 2021-10-22
    相关资源
    最近更新 更多