c++ 設計 保護された派生メンバを持つCRTP



奇妙 に 再帰 した テンプレート パターン (1)

CRTPパターンでは、派生クラスの実装機能を保護された状態に保つために問題が発生します。 基底クラスを派生クラスのフレンドとして宣言するか、このようなものを使用する必要があります(私はリンクされた記事でこのメソッドを試していません)。 派生クラスの実装関数を保護された状態に保つことを可能にする他の(簡単な)方法がありますか?

編集:これは簡単なコード例です:

template<class D> 
class C {
public:
    void base_foo()
    {
        static_cast<D*>(this)->foo();
    }
};


class D:  public C<D> {
protected: //ERROR!
    void foo() {
    }   
};

int main() {
    D d;
    d.base_foo();
    return 0;
}

上記のコードはerror: 'void D::foo()' is protected g ++ 4.5.1でerror: 'void D::foo()' is protectedていますが、 protectedpublic置き換えられた場合にコンパイルprotectedます。


それはまったく問題ではなく、派生クラスの1行で解決されます。

friend class Base< Derived >;

#include <iostream>

template< typename PDerived >
class TBase
{
 public:
  void Foo( void )
  {
   static_cast< PDerived* > ( this )->Bar();
  }
};

class TDerived : public TBase< TDerived >
{
  friend class TBase< TDerived > ;
 protected:
  void Bar( void )
  {
   std::cout << "in Bar" << std::endl;
  }
};

int main( void )
{
 TDerived lD;

 lD.Foo();

 return ( 0 );
}




crtp