c++ - 在 STL 容器中使用模板类

标签 c++ templates inheritance stl generic-programming

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

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

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

根据我的理解,创建一个 A 的 vector 对象不会被编译器接受,因为 A<int>A<char>实际上是不同的类型,我不能把它们放在同一个 vector 中。

我找到的解决方法是创建一个基类、一个派生模板类和一个基类指针 vector 。

class ABase {
  // ...
};

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

std::vector<BaseA*> mySuperVector;

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

最佳答案

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

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

如果您在运行时需要一个异构的对象容器,您确实需要某种多态性。使用基类 virtual methods 是一个有效的选项。如果您事先知道您的对象可以选择的所有类型,您也可以使用 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>在任何给定时间。事件替代项可以在运行时更改。

关于c++ - 在 STL 容器中使用模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53062609/

相关文章:

php - 轻量级基于 PHP5 的模板类/系统

python - 是否可以选择将哪些 kwargs 传递给 python 中的父类(super class)?

Java:从父类访问子类方法

c# - ASP.NET session 状态、序列化和继承

c++ - 为什么这些函数模板与实例化都不匹配?

c++ - 递归定义的嵌套类型(就不完整类型而言)

c++ - 在Windows中实现DICOM本地数据存储的一些常见做法是什么?

c++ - 模板参数推导和 SFINAE - 使用 std::enable_if

c++ - 类模板特化中模板参数的默认值

c++ - 显式使用模板,C++