考虑以下标准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
}
如果这是常规虚拟继承,我可以将虚拟f
和g
方法标记为纯粹:
struct Base
{
virtual void f()= 0;
virtual void g()= 0;
};
并获得关于Foo
抽象的编译时错误。但是CRTP没有提供这样的保护。我可以以某种方式实现它吗?运行时检查也是可以接受的。我考虑过将this-> f
指针与static_cast <Derived *> (this)->f
进行比较,但无法使其正常工作。