ホームページ > バックエンド開発 > C++ > C トレイトは、奇妙なことに繰り返し発生するテンプレート パターンの静的多態性と Typedef によるコンパイルの問題をどのように解決できるでしょうか?

C トレイトは、奇妙なことに繰り返し発生するテンプレート パターンの静的多態性と Typedef によるコンパイルの問題をどのように解決できるでしょうか?

Mary-Kate Olsen
リリース: 2024-12-11 01:51:09
オリジナル
229 人が閲覧しました

How Can C   Traits Solve Compilation Issues with Static Polymorphism and Typedefs in the Curiously Recurring Template Pattern?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート