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