C の仮想テンプレート メソッドを使用してポリモーフィズムを実現するにはどうすればよいでしょうか?

DDD
リリース: 2024-10-27 06:53:03
オリジナル
713 人が閲覧しました

How can you achieve polymorphism 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);
        template <class T> virtual T getData(std::string id);
};</code>
ログイン後にコピー

このクラスは、一意の識別子に基づいて、指定された型のデータを設定および取得することを目的としています。ただし、setData("foodouble", data) など、特定の型で汎用の 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>
ログイン後にコピー

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

  • ランタイムの保持多態性を備えていますが、型消去による静的多態性を排除します:
  • 型消去を提供する boost::any を利用して、任意の型のデータを格納します:
<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!