C 仮想テンプレート メソッド: テンプレートとランタイム ポリモーフィズムへの取り組み
C では、開発者はテンプレートの特殊化とランタイム ポリモーフィズムを組み合わせるというジレンマに直面していました。つまずきに遭遇します。この複雑さは、テンプレート パラメーターを受け入れる抽象クラス内に仮想メソッドを実装しようとするときに発生します。この課題は、テンプレート関数をインスタンス化する潜在的な型の数が膨大であることから生じており、そのため、コンパイラーが呼び出しを動的にディスパッチする能力が妨げられています。
この制限を克服するには、複数のアプローチを追求できます。 1 つのオプションには、動的なポリモーフィズムを削除し、キーと値のペアを格納するために非派生型を使用することが含まれます。基本クラス テンプレートを使用して、これらのマッピングを解決できます。
<code class="cpp">class AbstractComputation { public: template <typename T> void setData(const std::string& id, T value) { m_store.setData(id, value); } template <typename T> T getData(const std::string& id) const { return m_store.getData<T>(id); } protected: ValueStore m_store; };</code>
または、型消去を使用してテンプレート パラメーターを削除しながら、実行時のポリモーフィズムを保持することもできます。たとえば、boost::any を使用すると、型消去された引数を受け入れる具体的な非テンプレート関数の作成が可能になります。
<code class="cpp">class AbstractComputation { public: template <typename T> void setData(const std::string& id, T value) { setDataImpl(id, boost::any(value)); } template <typename T> T getData(const std::string& id) const { boost::any res = getDataImpl(id); return boost::any_cast<T>(res); } protected: virtual void setDataImpl(const std::string& id, const boost::any& value) = 0; virtual boost::any getDataImpl(const std::string& id) const = 0; };</code>
型消去により、基本的に boost::any のデータを保存できるようになります。タイプセーフなデータ取得を有効にしながら、あらゆるタイプをバックグラウンドで実行します。
以上が記事の内容に適した質問ベースのタイトルをいくつか示します。 * C 仮想テンプレート メソッド: 実行時ポリモーフィズムを使用してテンプレートの特殊化を実現するには? * C テンプレートとランタイムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。