奇妙なことに繰り返し発生するテンプレート パターン (CRTP) により、C で静的多態性が可能になりますが、次のことを目的とすると困難になります。派生型に基づいて関数の戻り値の型を変更します。 CRTP は通常、派生型を推論できますが、MSVC 2010 では次のコードでコンパイルの問題が発生します。
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; };
このエラーは、派生クラスが基本クラスのテンプレート パラメーターとして使用されるときに不完全であるために発生します。クラスリスト。この問題に対処するための一般的な回避策には、traits クラス テンプレートを使用することが含まれます。
// Declare the base_traits class template template <typename derived_t> struct base_traits; // Define the base class template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; }; // Define the derived class template <typename T> struct derived : public base<derived<T>> { typedef typename base_traits<derived<T>>::value_type value_type; }; // Specialization of base_traits for derived template <typename T> struct base_traits<derived<T>> { typedef T value_type; };
base_traits テンプレートを目的の派生型に特化することで、foo などの関数のカスタム戻り値の型を含む必要なメンバーを定義できます。 ()。この手法により、コンパイル エラーを回避しながら、戻り値の型をより柔軟にして静的ポリモーフィズムを実現できます。
以上がC 静的多態性 (CRTP) で柔軟な戻り値の型を実現し、コンパイル エラーを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。