在 STL 容器中使用模板 class
Using a template class in STL containers
如果我有一个模板 class,我想用不同的数据类型进行实例化:
template <typename T>
class A {
T value;
// ...
};
而且我还想在标准模板库容器(比如 vector
)中使用此 class 的对象。
根据我的理解,创建一个 A
对象的向量不会被编译器接受,因为 A<int>
和 A<char>
实际上是不同的类型,我不能将它们放入同一个向量。
我发现的解决方法是创建一个基 class、一个派生模板 class 和一个基 class 指针向量。
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>{}};
如果您在 运行 时需要一个对象的异构容器,您确实需要某种多态性。使用基础 class 和 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>
。活动备选方案可以在 运行 时更改。
需要类型转换为派生类型与作为 class 模板实例化的派生类型无关,这是一个设计问题。也许您需要虚函数或多个容器。
否则,您的解决方案没问题,但如果容器应该拥有所包含的对象,请切换到 std::unique_ptr
。
如果我有一个模板 class,我想用不同的数据类型进行实例化:
template <typename T>
class A {
T value;
// ...
};
而且我还想在标准模板库容器(比如 vector
)中使用此 class 的对象。
根据我的理解,创建一个 A
对象的向量不会被编译器接受,因为 A<int>
和 A<char>
实际上是不同的类型,我不能将它们放入同一个向量。
我发现的解决方法是创建一个基 class、一个派生模板 class 和一个基 class 指针向量。
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>{}};
如果您在 运行 时需要一个对象的异构容器,您确实需要某种多态性。使用基础 class 和 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>
。活动备选方案可以在 运行 时更改。
需要类型转换为派生类型与作为 class 模板实例化的派生类型无关,这是一个设计问题。也许您需要虚函数或多个容器。
否则,您的解决方案没问题,但如果容器应该拥有所包含的对象,请切换到 std::unique_ptr
。