在纯虚拟调用中,保持CRTP模式不会溢出

时间:2017-07-21 08:10:47

标签: c++ crtp pure-virtual virtual-method

考虑以下标准CRTP示例:

#include<iostream>

template<class Derived>
struct Base {
    void f() { static_cast<Derived *>(this)->f(); }
    void g() { static_cast<Derived *>(this)->g(); }
};

struct Foo : public Base<Foo> {
    void f() 
     { 
      std::cout << 42 << std::endl; }
     };

int main() 
{
    Foo foo;
    foo.f(); // just OK
    foo.g(); // this will stack overflow and segfault
}

如果这是常规虚拟继承,我可以将虚拟fg方法标记为纯粹:

struct Base 
{
    virtual void f()= 0;
    virtual void g()= 0;
};

并获得关于Foo抽象的编译时错误。但是CRTP没有提供这样的保护。我可以以某种方式实现它吗?运行时检查也是可以接受的。我考虑过将this-> f指针与static_cast <Derived *> (this)->f进行比较,但无法使其正常工作。

0 个答案:

没有答案