C の静的多態性と Typedef
Curiously Recurring Template Pattern (CRTP) は、静的多態性を実現する C の手法です。ただし、このパターンを一般化して、派生型に基づいて戻り値の型を変更しようとすると、MSVC 2010 を使用しているユーザーが遭遇したように、コードがコンパイルされない可能性があります。
問題:
次のコードは、派生クラスで異なる戻り値の型を許可することを目的としていますが、コンパイル:
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(); } };
発生したエラーは、「'派生' のメンバーではありません」です。これは、派生型がその基本クラスのテンプレート引数として使用されるときに不完全であるために発生します。
特性を使用した解決策:
一般的な回避策は、特性クラス テンプレートを使用することです。このアプローチでは、base_traits クラス テンプレートを定義して、派生クラスの型と関数の両方をカプセル化します。元の基本クラスは、これらの特性を使用するように変更されます。
template <typename derived_t> struct base_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)); } }; template <typename T> struct derived : base<derived<T>> { typedef typename base_traits<derived>::value_type value_type; value_type derived_foo() { return value_type(); } }; 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 クラスを特殊化することで、特性を通じて目的の型と関数にアクセスできるようになり、静的関数と関数の両方が有効になります。ポリモーフィズムと動的戻り値の型。
以上がC トレイトは、奇妙なことに繰り返し発生するテンプレート パターンの静的多態性と Typedef によるコンパイルの問題をどのように解決できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。