ホームページ > バックエンド開発 > C++ > C の派生クラスで CRTP と Typedef を使用する場合のコンパイル時エラーにどのように対処できますか?

C の派生クラスで CRTP と Typedef を使用する場合のコンパイル時エラーにどのように対処できますか?

Linda Hamilton
リリース: 2024-12-06 17:53:12
オリジナル
885 人が閲覧しました

How Can We Address Compile-Time Errors When Using CRTP and Typedef in C   Derived Classes?

C の派生クラスからの静的ポリモーフィズムと Typedef の使用

C の強力な機能の 1 つである Curiously Recurring Template Pattern (CRTP) により、静的ポリモーフィズムが可能になります。これにより、テンプレート引数に基づいて作成されるオブジェクトのタイプをコンパイル時に柔軟に決定できるようになります。ただし、派生型に基づいて関数の戻り型を変更できるように 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();
    }
};
ログイン後にコピー

このコードはコンパイルに失敗します。 Microsoft Visual Studio 2010 で次のエラーが発生する: 'value_type' はメンバーではありません'derived'.

この問題は、derived が基本クラス リスト内の Base のテンプレート引数として使用される場合に不完全であるという事実に起因します。これに対処する一般的な回避策は、特性クラス テンプレートを使用することです。

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));
    }
};
ログイン後にコピー

そして、base_traits を次のように特化します派生:

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 の派生クラスで CRTP と Typedef を使用する場合のコンパイル時エラーにどのように対処できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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