C++ 将模板化类的多种类型存储到容器中
如果我有一个带有模板的类:C++ 将模板化类的多种类型存储到容器中,c++,templates,containers,C++,Templates,Containers,如果我有一个带有模板的类: template<typename T> class foo{ T m_a; foo(T a){ m_a = a; }; ~foo(){ }; }; EventManager需要创建EventListener并将其存储到向量中,以便能够记住它们并在析构函数中删除它们 这就是我被卡住的地方。一个类模板的不同实例化是不同的(从编译器的角度来看,完全不相关)类型,因此适用。如果您想要例如std::v
template<typename T>
class foo{
T m_a;
foo(T a){
m_a = a;
};
~foo(){
};
};
EventManager需要创建EventListener并将其存储到向量中,以便能够记住它们并在析构函数中删除它们
这就是我被卡住的地方。一个类模板的不同实例化是不同的(从编译器的角度来看,完全不相关)类型,因此适用。如果您想要例如
std::vector
,那么您需要使用非模板基类。它需要使用动态分派,因此所有公共接口都应该声明为虚拟的
struct foo_base {
virtual ~foo_base() {}
virtual void something() = 0;
};
template <typename T>
struct foo : foo_base {
// ...
void something() { /* do something with T */ }
};
第三种方法是使用boost::any
,但这将需要boost::any_cast
,无论您在何处使用它们,并且绝对允许在向量中存储任何内容
std::vector<boost::any> v;
std::vector v;
您可以为用户定义的类型存储指向基类的指针。这带来了另一个问题,如果类模板具有相同的函数,并且它们被存储。我可以在不知道它们的类类型的情况下调用这些函数吗?现在您正在讨论多态性。可以通过使类模板从定义要以多态方式调用的函数的类继承来实现这一点。然后,您必须在容器中存储指针,这样就可以开始了。当我输入这条评论时,@Cat Plus已经发布了一个答案来解释这一点。如果something()需要使用T作为参数,例如something(ta)。这还能用吗?@Blizter:不会,除非你把它打包到例如boost::any
中,然后在具体的子类中解包。所有类中的接口必须相同,基类方法才能工作。为什么必须将整个公共接口声明为虚拟接口?我不能拥有一个非虚拟的公共成员并从子模板类中使用它吗?
struct foo_base {
virtual ~foo_base() {}
virtual void something() = 0;
};
template <typename T>
struct foo : foo_base {
// ...
void something() { /* do something with T */ }
};
typedef boost::variant<foo<int>, foo<std::string>> foo_variants;
std::vector<foo_variants> v;
std::vector<boost::any> v;