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中文网其他相关文章!