私はCRTPの周りを頭の中に入れようとしています。このフォーラムを含め、いくつかの良い情報源がありますが、私は静的多型の基本についていくらか混乱していると思います。以下のWikipediaのエントリを見て:CRTP静的多型についての混乱
template <class T>
struct Base
{
void implementation()
{
// ...
static_cast<T*>(this)->implementation();
// ...
}
static void static_func()
{
// ...
T::static_sub_func();
// ...
}
};
struct Derived : public Base<Derived>
{
void implementation();
static void static_sub_func();
};
は、私は、これはちょっとコンパイル時の仮想関数のように、()派生クラスでバリアント私は別の実装を持っているのに役立ちますことを理解しています。しかし、私の混乱は、私が原因ベースのテンプレートされることに、私は通常の継承と仮想関数と同じように、私は
void func(Base x){
x.implementation();
}
のような機能を持つことができないと思うが、私は
func(Derived x)
を指定するかなければならないことですまたは
template<class T>
func(T x)
を使用するので、CRTPは、実際には、単に派生:: Baseの簡単な方法を実現する/シャドーイングとは反対に、この文脈で私を何を買うのか?複数の関数が含まれているときCRTPの
struct Base
{
void implementation();
struct Derived : public Base
{
void implementation();
static void static_sub_func();
};
議論されています。ポリモーフィックな振る舞い(静的または動的多態性を使用するかどうかに関わらず)を参照またはポインタで渡します。 –
私のために働かない、変数を得るか、フィールド 'func'が宣言されたvoid void func(Base&x)... – user32849
@ user32849 'Base'はテンプレートです。あなたは 'Base&'だけ使うことはできません。テンプレートの引数 'Base &'を入力する必要があります。これは 'func'もテンプレートでなければならないことを意味します。 – Angew