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

如何在 C 中實作虛擬模板方法?

Barbara Streisand
發布: 2024-10-26 09:18:30
原創
432 人瀏覽過

How to Implement Virtual Template Methods in C  ?

C 虛擬模板方法

所呈現的場景涉及一個具有虛擬模板方法setData 和getData 的抽象類,旨在動態設定和檢索基於提供的標識符的各種類型的資料。然而,正如問題所承認的,C 中不直接支持這樣的構造。

要解決此限制,有兩種主要方法:

刪除靜態多態性

一種選擇是刪除靜態多態性(模板)並引入中間儲存機制。 AbstractComputation 類別可以定義一個非模板化的 ValueStore,負責根據標識符儲存和檢索資料:

<code class="cpp">class ValueStore {
public:
  template <typename T>
  void setData(std::string const &id, T value) {...}
  
  template <typename T>
  T getData(std::string const &id) {...}
};

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);
  }

private:
  ValueStore m_store;
};</code>
登入後複製

派生類別可以直接存取 ValueStore,而不需要運行時多態性。

刪除運行時多態性

或者,可以在刪除靜態多態性的同時保留運行時多態性。這涉及到對基類執行類型擦除:

<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>
登入後複製

boost::any 是一種可以儲存任何類型的值並允許安全檢索資料的類型。類型擦除是透過將 boost::any 物件作為參數傳遞給虛擬方法來執行的,虛擬方法必須在衍生類別中實作。

以上是如何在 C 中實作虛擬模板方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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