奇怪的继承模式

时间:2016-05-30 14:39:48

标签: c++ templates inheritance

假设我有这样一个基类:

class Abstract {
  public:
    /* This type should be the deriver of this class */ 
    virtual DerivedType foo(void) = 0;
};

我希望DerivedType根据从这个类派生的人而有所不同。实际上,我希望DerivedType成为来自Derives Abstract的类型。

我意识到我可以这样做:

template<typename der_t>
class Abstract {
  public:
    virtual der_t foo(void) = 0;
};

然后它应该像这样使用:

class Derived : public virtual Abstract<Derived> { };

不幸的是,没有办法强迫某人在模板中传递正确的类型。那是有人可以这样做的:

class Derived : public virtual Abstract<int> { };

那么有没有更好的方法来做到这一点,还是有办法强迫某人传递正确的参数?

1 个答案:

答案 0 :(得分:2)

CRTP的常用技巧是拥有一个私有构造函数,只有传入的类可以通过friend指令访问:

template <class Derived>
struct Crtp {

private:
    friend Derived;

    Crtp() = default;
};

它并不完美,但可以防止错误。

注意:static_assert不是一个实际的解决方案,因为在实例化CrtpDerived仍然不完整,并且无法检查基类。< / p>