首頁  >  文章  >  後端開發  >  如何使用 C 中的虛擬模板方法實現多態性?

如何使用 C 中的虛擬模板方法實現多態性?

DDD
DDD原創
2024-10-27 06:53:03714瀏覽

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 函數時會出現問題,例如 setData("foodouble", data)。

語言禁止此構造,因為編譯器必須動態地調度無限數量的可能的模板實例。要解決此問題,可以採用以下幾種方法:

刪除靜態多態性:

  • 透過引入單獨的類型來儲存鍵值來消除靜態多態性映射。然後,範本可以在基礎層級解決此問題,而不需要多態性:
<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn