我有一个班级
class A{
vector<B> arr;
};
,其中
template <class T>
class B{
T member;
};
如何能够做类似
的事情A container;
B<int> b1;
B<char> b2;
...
container.arr.push_back(b1);
container.arr.push_back(b2);
我尝试在A类之前添加模板,但我不想让A类指定模板,因为那样我就无法推送不同类型的对象了。我该怎么处理这个?
答案 0 :(得分:2)
正如在一些评论中所提到的,将不同类型的变量存储到std::vector
可能不是一个好主意,事实上,如果你需要这样做,这些类型很可能有一些共同点,这样你就可以了可以找到更合适的方法来实现您的目标,例如创建std::vector<std::unique_ptr<Base_Type>>
。
但是,您尝试使用std::any
的方式稍有不同。
template <typename T>
struct B
{
T member;
};
// ...
std::vector<std::any> v;
B<int> bi {123};
B<char> bc {'@'};
B<std::string> bs {"I am a string"};
v.push_back(bi);
v.push_back(bc);
v.push_back(bs);
// Go through vector. You will have to check for the type and
// cast it appropriately before doing anything useful.
for (auto x : v) {
if (x.type() == typeid(B<int>))
std::cout << std::any_cast<B<int>>(x).member << std::endl;
else if (/* ... */)
// ...
}
// ...
如维托里奥所解释的,另一种选择可能是std::vector
std::variant
。
答案 1 :(得分:1)
template
是编译时代码生成构造。在您的代码示例中,B
不是类型,而是模板。
模板可以在编译时实例化以生成类型(例如B<int>
)。
std::vector<T>
是在T
上参数化的容器模板类 - 它只能存储T
类型的对象。
如果要在同一容器中存储不同类型的对象,可以:
如果您在编译时知道对象序列,请使用std::tuple<Ts...>
;
如果在运行时之前您不知道对象是std::vector<std::variant<A, B>>
还是A
,请使用B
之类的内容。