2017-10-17 22 views
0

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 
    } 

}; 

+2

機能は仮想ではないため、vtableはありません。 – Jodocus

+0

CRTPを反映するように修正されたコードスニペット。 – Ryan

+0

セカンドタイプは役に立たないようです。不足している詳細がある場合は、 'FirstType 'から継承する必要があります。 'foo'メソッドはありません。最後に、あなたのチェーンの「最初のレベル」が何であるか分かりません。あなたは実際に何が欲しいかを判断するために細部をあまりにも投げ捨てました、あるいはあなたのデザインは悪いです。分かりません。 – Yakk

答えて

1

両方の機能に同じ名前を使用できますが、正常に動作します。

異なる名前を使用する利点は、実行時に無限再帰とスタックオーバーフローが発生するのではなく、派生クラスで関数を実装できないとコンパイラエラーが発生することです。

+0

私は理解しています。そのため、APIを書くときに同じ関数名を使用するのが一般的に嫌われているのですか?それともこの一般的な方法ですか? – Ryan

関連する問題