gpt4 book ai didi

c++ - 将多种类型的模板化类存储到容器中

转载 作者:行者123 更新时间:2023-11-30 00:39:44 26 4
gpt4 key购买 nike

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

template<typename T>
class foo{
T m_a;

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

~foo(){

};
};

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

例如,可以存储指向 foo< int > 的指针的 vector 和 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 并将其存储到一个 vector 中,以便能够记住它们并在析构函数中删除它们。

这就是我被困的地方。

最佳答案

如果你想要,例如std::vector<foo<T>*> ,那么你需要使用一个非模板化的基类。它需要使用动态调度,所以所有的公共(public)接口(interface)都应该声明为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 .这限制了您可以存储的类型数量,但同时不需要基类和虚拟接口(interface)。

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

第三种方式是使用boost::any , 但这需要 boost::any_cast无论您在哪里使用它们,都可以将任何内容存储在 vector 中。

std::vector<boost::any> v;

关于c++ - 将多种类型的模板化类存储到容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com