If I have a class with a template:
template
class foo{
T m_a;
foo(T a){
m_a = a;
};
~foo(){
};
};
If you want e.g. std::vector
, then you need to use a non-templated base class. It will need to use dynamic dispatch, so all of the public interface should be declared virtual
.
struct foo_base {
virtual ~foo_base() {}
virtual void something() = 0;
};
template
struct foo : foo_base {
// ...
void something() { /* do something with T */ }
};
Then your container is std::vector
. Another, perhaps better, way, is to use boost::variant
. This limits the number of types you can store, but at the same time doesn't require base class and virtual interface.
typedef boost::variant, foo> foo_variants;
std::vector v;
Third way is to use boost::any
, but that will require boost::any_cast
wherever you use them, and allow absolutely anything to be stored in the vector.
std::vector v;