如果我有一个模板类,我想用不同的数据类型实例化它:
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/