C 仮想テンプレート メソッド
C では、静的な時間ポリモーフィズム (テンプレート) と実行時ポリモーフィズムを組み合わせるのは困難な場合があります。これは、次の抽象クラスで明らかです。
<code class="cpp">class AbstractComputation { public: template <class T> virtual void setData(std::string id, T data); template <class T> virtual T getData(std::string id); };</code>
このクラスは、一意の識別子に基づいて、指定された型のデータを設定および取得することを目的としています。ただし、setData
コンパイラが動的にコンストラクトを実行する必要があるため、言語ではこの構造が禁止されています。無限の数のテンプレートのインスタンス化をディスパッチします。この問題を解決するには、いくつかのアプローチが可能です。
静的多態性の削除:
<code class="cpp">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>
動的ポリモーフィズムの削除:
<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>
以上がC の仮想テンプレート メソッドを使用してポリモーフィズムを実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。