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
考えられる解決策
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 サイトの他の関連記事を参照してください。