派生クラスからの Typedef を使用した C 静的多態性 (CRTP)
静的多態性 (コンパイル時多態性とも呼ばれます) では、次のタイプ派生クラスはコンパイル時に基本クラスに認識されます。これは、奇妙に繰り返されるテンプレート パターン (CRTP) を使用して実現できます。ただし、派生型に基づいて関数の戻り型をカスタマイズすることもできます。
次のコードを検討してください。
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; value_type foo() { return static_cast<derived_t*>(this)->foo(); } }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; value_type foo() { return T(); //return some T object (assumes T is default constructable) } };
ただし、このコードは、次のコードを使用しているためコンパイルできない可能性があります。基本クラス テンプレート内の派生クラスからの型エイリアス value_type。エラーは、base.
へのテンプレート引数として使用される場合、派生が不完全であるということです。解決策の 1 つは、特性クラス テンプレートを使用することです。変更された例は次のとおりです。
// Declare a base_traits traits class template: template <typename derived_t> struct base_traits; // Define the base class that uses the traits: template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; value_type base_foo() { return base_traits<derived_t>::call_foo(static_cast<derived_t*>(this)); } }; // Define the derived class; it can use the traits too: template <typename T> struct derived : base<derived<T>> { typedef typename base_traits<derived>::value_type value_type; value_type derived_foo() { return value_type(); } }; // Declare and define a base_traits specialization for derived: template <typename T> struct base_traits<derived<T>> { typedef T value_type; static value_type call_foo(derived<T>* x) { return x->derived_foo(); } };
各派生型の Base_traits を特殊化することで、基本クラス テンプレートに必要な必要なメンバー (value_type と call_foo) を提供できます。これにより、基本クラス テンプレート内の派生クラスから typedef と関数にアクセスできるようになり、カスタマイズされた戻り値の型で静的ポリモーフィズムを実現できます。
以上がC の CRTP は静的ポリモーフィズムの派生クラスからの Typedef をどのように処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。