ホームページ >バックエンド開発 >C++ >C の仮想テンプレート メソッドを使用してタイプセーフな動的ディスパッチを実現するにはどうすればよいですか?

C の仮想テンプレート メソッドを使用してタイプセーフな動的ディスパッチを実現するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 08:44:30322ブラウズ

How to Achieve Type-Safe Dynamic Dispatch with Virtual Template Methods in C  ?

C の型多態性 : 仮想テンプレート メソッド

C プログラミングでは、仮想メンバー関数とクラス テンプレートを組み合わせるのが難しい場合があります。この状況は、実行時の型情報に基づいてメソッドを動的にディスパッチしたいが、型安全な動作を維持したい場合に発生します。

問題

次の抽象クラスを考えてみましょう。その派生実装:

<code class="cpp">class AbstractComputation {
public:
    template <class T> virtual void setData(std::string id, T data) = 0;
    template <class T> virtual T getData(std::string id) = 0;
};

class Computation : public AbstractComputation {
public:
    template <class T> void setData(std::string id, T data);
    template <class T> T getData(std::string id, T data);
};</code>

ここでの目的は、setData("foodouble", data) を呼び出すと、foodouble によって識別された double が data の値に設定されることです。

考えられる解決策

1.静的ポリモーフィズムの削除:

1 つのアプローチは、静的ポリモーフィズム (テンプレート) を削除し、キーと値のペアの汎用ストアを導入することです:

<code class="cpp">class ValueStore {
    template <typename T>
    void setData(std::string const & id, T value);
    template <typename T>
    T getData(std::string const & id) const;
};

class AbstractComputation {
public:
    template <typename T>
    void setData(std::string const & id, T value) { m_store.setData(id, value); }
    template <typename T>
    T getData(std::string const & id) const { return m_store.getData<T>(id); }
protected:
    ValueStore m_store;
};</code>

このソリューションは、テンプレートの特殊化が必要です。

2.動的ポリモーフィズムの削除:

もう 1 つのオプションは、ランタイム ポリモーフィズムを維持しながら静的ポリモーフィズムを削除することです:

<code class="cpp">class AbstractComputation {
public:
    template <typename T>
    void setData( std::string const & id, T value ) { setDataImpl( id, boost::any( value ) ); }
    template <typename T>
    T getData( std::string const & id ) const {
        boost::any res = getDataImpl( id );
        return boost::any_cast<T>( res );
    }
protected:
    virtual void setDataImpl( std::string const & id, boost::any const & value ) = 0;
    virtual boost::any getDataImpl( std::string const & id ) const = 0;
};</code>

ここでは、boost::any を使用した型消去により、テンプレート化されていないものへのディスパッチが可能になります。型安全性を犠牲にすることなくメソッドを使用できます。

以上がC の仮想テンプレート メソッドを使用してタイプセーフな動的ディスパッチを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。