保护CRTP:私有析构函数是唯一的解决方案吗?

时间:2015-11-19 14:55:23

标签: c++ language-lawyer crtp static-assert

如何避免

template <typename Derived>
struct base { int foo() { return static_cast<Derived*>(this)->bar(); } };

struct derived : base<derived> { int bar(); };        
struct another_derived : base<derived> { int bar(); };  // error: wrong base

在派生类中没有附加代码

有人问twice before(虽然没有额外的条件避免派生类中的其他代码),建议使用answer

template <typename Derived>
struct base {
  int foo() { return static_cast<Derived*>(this)->bar(); } 
private:
  ~base() {}
  friend Derived;
};

但是,这不仅可以抵御上述错误,还可以使Base的所有私人成员都可以从Derived访问。有没有替代方案可以避免这种情况?或者可以最终证明这是不可能的?

修改

我实际上有一个更复杂的问题,除了通常的用法(如上所述)之外还有

template<typename Derived>
struct intermediate : base<Derived>
{
  int bar() { return static_cast<Derived*>(this)->ark(); }
};

当私有析构函数失败时(因为intermediate未与base成为朋友)。

0 个答案:

没有答案