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