包含带模板对象的容器的类

时间:2018-06-01 11:58:47

标签: c++ templates polymorphism

我有一个班级

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类指定模板,因为那样我就无法推送不同类型的对象了。我该怎么处理这个?

2 个答案:

答案 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之类的内容。