首页 >后端开发 >C++ >如何使用 C 中的虚拟模板方法实现类型安全的动态调度?

如何使用 C 中的虚拟模板方法实现类型安全的动态调度?

Barbara Streisand
Barbara Streisand原创
2024-10-26 08:44:30322浏览

How to Achieve Type-Safe Dynamic Dispatch 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) = 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("foodouble", data) 会将 foodouble 标识的 double 设置为 data 的值。

可能的解决方案

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

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