将多种类型的模板类存储到容器中

2024-03-14

如果我有一个带有模板的类:

template<typename T>
class foo{
    T m_a;

    foo(T a){
        m_a = a;
    };

    ~foo(){

    };
};

有没有办法存储它的多个变体?

例如,可以存储指向的向量foo< int > and foo< string >同时 ?

编辑更多信息

我想隐藏这个的实现:

EventListener<string> ev1;
EventListener<int, int> ev2;
EventListener<int, string, double> ev3;

ev1(&Events::nameChange, &nameChangeCallback);
ev2(&Events::healthChange, &healthChangeCallback);
ev3(&Events::newUser, &newUserCallback);

ev1.processEvents();
ev2.processEvents();
ev3.processEvents();

进入这个:

EventManager em;
em.listen(&Events::nameChange, &nameChangeCallback);
em.listen(&Events::healthChange, &healthChangeCallback);
em.listen(&Events::newUser, &newUserCallback);
em.processEvents();

EventManager 需要创建 EventListener 并将其存储到向量中,以便能够记住它们并在析构函数中删除它们。

这就是我被困住的地方。


如果你想要例如std::vector<foo<T>*>,那么您需要使用非模板化基类。它将需要使用动态调度,因此应声明所有公共接口virtual.

struct foo_base {
    virtual ~foo_base() {}
    virtual void something() = 0;
};

template <typename T>
struct foo : foo_base {
    // ...
    void something() { /* do something with T */ }
};

那么你的容器是std::vector<foo_base*>。另一种也许更好的方法是使用boost::variant。这限制了您可以存储的类型数量,但同时不需要基类和虚拟接口。

typedef boost::variant<foo<int>, foo<std::string>> foo_variants;
std::vector<foo_variants> v;

第三种方法是使用boost::any,但这需要boost::any_cast无论您在何处使用它们,并且绝对允许将任何内容存储在向量中。

std::vector<boost::any> v;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多种类型的模板类存储到容器中 的相关文章

随机推荐