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