C 虛擬模板方法
在C 中,將靜態時間多態性(模板)與運行時多態性結合起來可能具有挑戰性。這在以下抽象類別中很明顯:
<code class="cpp">class AbstractComputation { public: template <class T> virtual void setData(std::string id, T data); template <class T> virtual T getData(std::string id); };</code>
此類旨在根據唯一識別碼設定和檢索指定類型的資料。但是,當嘗試使用特定類型呼叫通用 setData 函數時會出現問題,例如 setData
語言禁止此構造,因為編譯器必須動態地調度無限數量的可能的模板實例。要解決此問題,可以採用以下幾種方法:
刪除靜態多態性:
<code class="cpp">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>
刪除動態多態性:
<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>
以上是如何使用 C 中的虛擬模板方法實現多態性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!