CRTPパターンを使用すると、ベースタイプで呼び出された関数名は、派生タイプの別の名前の実装関数を指しているように見えます(例:ベースメイクのfoo()
呼び出しはstatic_cast<DerivedType*>(this)->foo_implementation();
。同じメンバ関数名を持つCRTPを使用する
同じ関数名を使用してCRTPパターンを実装する方法はありますか?関数のチェーンの最初のレベルに具体的な実装がない可能性があるより長い継承チェーンがあります。
私は次のようなものを持っています:
01コンパイラは、この文句はありませんが、私はそれがCRTPを使用しての目的を破って、(表示されないvirtual
キーワードにもかかわらず)暗黙のvtableの検索につながることを想像もちろん
template <typename SecondType>
struct FirstType {
void foo() {
static_cast<SecondType*>(this)->foo();
}
};
template <typename ThirdType>
struct SecondType : FirstType<SecondType> {
void foo() {
static_cast<ThirdType*>(this)->foo();
}
};
struct ThirdType : SecondType<ThirdType> {
void foo() {
// Concrete implementation here
}
};
。
機能は仮想ではないため、vtableはありません。 – Jodocus
CRTPを反映するように修正されたコードスニペット。 – Ryan
セカンドタイプは役に立たないようです。不足している詳細がある場合は、 'FirstType'から継承する必要があります。 'foo'メソッドはありません。最後に、あなたのチェーンの「最初のレベル」が何であるか分かりません。あなたは実際に何が欲しいかを判断するために細部をあまりにも投げ捨てました、あるいはあなたのデザインは悪いです。分かりません。 –
Yakk