如何避免
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
成为朋友)。