如果我有一个带模板的课程:
template<typename T>
class foo{
T m_a;
foo(T a){
m_a = a;
};
~foo(){
};
};
有没有办法存储多种变体?
例如,可以同时存储指向foo< int >
和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需要创建EventListeners并将其存储到向量中,以便能够记住它们并在析构函数中删除它们。
这就是我被困住的地方。
答案 0 :(得分:6)
如果你想要,例如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;
答案 1 :(得分:1)
类模板的不同实例化不同(从编译器角度来看完全不相关)类型,因此适用this question。