在STL容器中使用模板类

时间:2018-10-30 10:46:50

标签: c++ templates inheritance stl generic-programming

如果我有一个模板类,我想用不同的数据类型实例化:

template <typename T>
class A {
  T value;
  // ...
};

我还想在“标准模板库”容器(例如vector)中使用此类的对象。

根据我的理解,创建A对象的向量不会被编译器接受,因为A<int>A<char>实际上是不同的类型,我不能将它们放在相同的位置向量。

我发现的解决方法是创建一个基类,一个派生的模板类以及一个基类指针的向量。

class ABase {
  // ...
};

template <typename T>
class ADerived : public ABase{
  T value;
  // ...
};

std::vector<BaseA*> mySuperVector;

我正开始尝试使用模板来获得更好的理解,我想知道是否有更好的解决方案。我上面的解决方法也让我头疼,因为恐怕在某些时候不可避免地会进行类型转换。

2 个答案:

答案 0 :(得分:3)

模板是编译时代码生成结构。如果在编译时需要异构的对象容器,则可以使用std::tuple

std::tuple my_tuple{A<int>{}, A<char>{}, A<double>{}};

如果在运行时需要异构的对象容器,则确实需要某种多态性。将基类与virtual方法一起使用是有效的选项。如果您知道对象可以预先选择所有类型,则也可以使用std::variant

using my_a = std::variant<A<int>, A<char>, A<double>>;
std::vector<my_a> vec;

在这种情况下,my_a可以在任何给定时间为A<int>A<char>A<double>。活动的替代项可以在运行时更改。

答案 1 :(得分:2)

需要类型转换为派生类型与派生类型与类模板的实例化无关,这是一个设计问题。也许您需要虚拟函数或多个容器。

否则,您的解决方案就可以了,但是如果容器应该拥有所包含的对象,请切换到std::unique_ptr