C 中的類型多態性:虛擬模板方法
在C 程式設計中,將虛擬成員函數與類別模板結合起來可能具有挑戰性。當您想要根據執行時間類型資訊動態分派方法,但仍保持類型安全行為時,就會發生這種情況。
問題
考慮以下抽象類別和它的衍生實作:
<code class="cpp">class AbstractComputation { public: template <class T> virtual void setData(std::string id, T data) = 0; template <class T> virtual T getData(std::string id) = 0; }; class Computation : public AbstractComputation { public: template <class T> void setData(std::string id, T data); template <class T> T getData(std::string id, T data); };</code>
這裡的目的是呼叫setData
可能的解決方案
1.刪除靜態多態性:
一種方法是消除靜態多態性性(模板)並引入鍵值對的通用儲存:
<code class="cpp">class ValueStore { template <typename T> void setData(std::string const & id, T value); template <typename T> T getData(std::string const & id) const; }; 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>
此解決方案提供動態多態性,而無需需要模板專門化。
2.刪除動態多態性:
另一個選項是維護運行時多態性,但刪除靜態多態性:
<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 進行類型擦除允許分派到非模板化不犧牲類型安全的方法。
以上是如何使用 C 中的虛擬模板方法實現類型安全的動態調度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!