假设我有一个像这样的基类:

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> { };

那么,有没有更好的方法可以执行此操作,或者有什么方法可以强制某人传递正确的参数?

最佳答案

CRTP的通常技巧是拥有一个私有(private)构造函数,只有传入的类才能通过friend指令进行访问:

template <class Derived>
struct Crtp {

private:
    friend Derived;

    Crtp() = default;
};

它不是完美的,但是要防止错误。

注意:static_assert并不是一个实际的解决方案,因为在实例化Crtp时,Derived仍不完整,无法检查基类。

关于c++ - 奇怪的继承模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37528331/

10-09 15:57