首頁 > 後端開發 > C++ > 主體

以下是一些適合您文章內容的基於問題的標題: * C 虛擬模板方法:如何透過運行時多態性實現模板專業化? * C 模板和運行時

Linda Hamilton
發布: 2024-10-27 06:47:29
原創
765 人瀏覽過

Here are a few question-based titles that fit the content of your article:

* C   Virtual Template Methods: How to Achieve Template Specialization with Runtime Polymorphism?
* C   Template and Runtime Polymorphism: Can Virtual Template Methods Be Implemen

C 虛擬模板方法:解決模板和運行時多態性

在C 語言中,開發人員面臨著將模板專業化與運行時多態性結合的困境遇到絆腳石。當嘗試在接受模板參數的抽象類別中實作虛擬方法時,就會出現這種複雜性。挑戰源自於實例化模板函數的潛在類型的絕對數量,阻礙了編譯器動態分派呼叫的能力。

為了克服此限制,可以採用多種方法。一種選擇涉及刪除動態多態性並使用非派生類型來儲存鍵值對。然後可以使用基類模板來解析這些映射:

<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!