在STL容器中使用模板类

Using a template class in STL containers

本文关键字:STL      更新时间:2023-10-16

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

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;

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

Templates是一个编译时代码生成构造。如果在编译时需要一个对象的异构容器,那么可以使用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>。活动备选方案可以在运行时更改。

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

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

相关文章:
  • 没有找到相关文章