首页  >  文章  >  后端开发  >  如何使用 C 中的虚拟模板方法实现多态性?

如何使用 C 中的虚拟模板方法实现多态性?

DDD
DDD原创
2024-10-27 06:53:03714浏览

How can you achieve polymorphism with virtual template methods in C  ?

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("foodouble", data)。

该语言禁止此构造,因为编译器必须动态地调度无限数量的可能的模板实例。要解决此问题,可以采用以下几种方法:

删除静态多态性:

  • 通过引入单独的类型来存储键值来消除静态多态性映射。然后,模板可以在基础级别解决此问题,而不需要多态性:
<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>

删除动态多态性:

  • 保留运行时多态性,但通过类型擦除消除静态多态性:
  • 利用提供类型擦除的 boost::any 来存储任何类型的数据:
<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn