C 仮想テンプレート メソッド
提示されたシナリオには、動的に設定および取得することを目的とした仮想テンプレート メソッド setData および getData を持つ抽象クラスが含まれます。提供された識別子に基づいてさまざまなタイプのデータ。ただし、質問で認められているように、そのような構造は C では直接サポートされていません。
この制限に対処するには、主に 2 つのアプローチがあります:
静的多態性の削除
1 つのオプションは、静的な多態性 (テンプレート) を削除し、中間ストレージ メカニズムを導入することです。 AbstractComputation クラスは、識別子に基づいてデータの保存と取得を担当する、テンプレート化されていない ValueStore を定義できます。
<code class="cpp">class ValueStore { public: template <typename T> void setData(std::string const &id, T value) {...} template <typename T> T getData(std::string const &id) {...} }; 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); } private: ValueStore m_store; };</code>
派生クラスは、実行時ポリモーフィズムを必要とせずに、ValueStore に直接アクセスできます。
実行時多態性の削除
あるいは、静的多態性を削除しながら実行時多態性を保持することもできます。これには、基本クラスで型消去を実行することが含まれます。
<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 は、任意の型の値を格納でき、データを安全に取得できる型です。型の消去は、boost::any オブジェクトを引数として仮想メソッドに渡すことによって実行されます。これは派生クラスで実装する必要があります。
以上がC で仮想テンプレート メソッドを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。