「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ の仮想テンプレート メソッドを使用してポリモーフィズムを実現するにはどうすればよいでしょうか?

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

2024 年 11 月 8 日に公開
ブラウズ:471

How can you achieve polymorphism with virtual template methods in C  ?

C 仮想テンプレート メソッド

C では、静的な時間ポリモーフィズム (テンプレート) と実行時ポリモーフィズムを組み合わせるのは難しい場合があります。これは、次の抽象クラスで明らかです。

class AbstractComputation {
    public:
        template  virtual void setData(std::string id, T data);
        template  virtual T getData(std::string id);
};

このクラスは、一意の識別子に基づいて、指定されたタイプのデータを設定および取得することを目的としています。ただし、setData("foodouble", data) など、特定の型で汎用の setData 関数を呼び出そうとすると問題が発生します。

コンパイラが動的にコンストラクトを実行する必要があるため、言語ではこの構造が禁止されています。無限の数のテンプレートのインスタンス化をディスパッチします。この問題を解決するには、いくつかのアプローチが可能です:

静的多態性の削除:

  • キーと値を格納する別の型を導入して静的多態性を排除します。マッピング。テンプレートは、ポリモーフィズムを必要とせずに、これを基本レベルで解決できます。
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      m_store.setData( id, value );
   }
   template 
   T getData( std::string const & id ) const {
      return m_store.getData( id );
   }
protected:
   ValueStore m_store;
};

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

  • 実行時ポリモーフィズムを保持しますが、型消去による静的ポリモーフィズムを排除します:
  • boost::any を使用します。タイプ消去を提供し、あらゆるデータを保存しますtype:
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      setDataImpl( id, boost::any( value ) );
   }
   template 
   T getData( std::string const & id ) const {
      boost::any res = getDataImpl( id );
      return boost::any_cast( res );
   }
protected:
   virtual void setDataImpl( std::string const & id, boost::any const & value ) = 0;
   virtual boost::any getDataImpl( std::string const & id ) const = 0;
};
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3