18
CRTP patternでは、派生クラスの実装機能を保護された状態に保つために問題が発生します。派生クラスのフレンドとして基本クラスを宣言するか、something like thisを使用する必要があります(私はリンクされた記事でこのメソッドを試していません)。派生クラスの実装関数を保護された状態に保つことを可能にする他の(簡単な)方法がありますか?保護された派生メンバーを持つ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;
}
上記のコードはG ++ 4.5.1でerror: ‘void D::foo()’ is protected
を与えるがprotected
はpublic
によって置換される場合にコンパイル。
これは、仮想関数がのためにあるものではないですか? –
@BoPersson、仮想関数は実行時多型、CRTPはコンパイル時多型です。両方のための世界の余地があります。 http://market.wikipedia.org/wiki/Curiously_recurring_template_patternを参照してください。 –
@マーク - 確かにありますが、派生クラスの保護された関数を呼び出す必要がある場合、バーチャルは適切に見えます。 :-) –