模板化向量的向量

时间:2019-06-07 08:04:46

标签: c++ templates vector

我想创建一个向量载体,其中各个向量可以是不同类型,如下所示:

for epoch in range(epochs):
    for iter, data in enumerate(dataset):
        model.train(data, epoch)

在这种情况下,n应该是什么?

我的实际用例:

我有不同数据类型的向量,需要将它们写到磁盘上。每次我向数据集添加一列时,我都不必在各个不同位置指定该列。我希望能够轻松地遍历各列。

2 个答案:

答案 0 :(得分:5)

有许多方法可以执行此操作,具体取决于您的情况。这是带有std :: variant:

的变体(双关语)
std::vector<int> v1 = { 1, 2, 3 };
std::vector<float> v2 = { 4.5f, 5.5f, 6.5f };
std::vector<double> v3 = { 7.5, 8.5, 9.5 };

std::vector<std::variant<std::vector<int>, std::vector<float>, std::vector<double>>> all;
all.push_back(v1);
all.push_back(v2);
all.push_back(v3);

for(auto& variant : all)
{
    std::visit([](const auto& container) {
        for(auto value : container)
        {
            std::cout << value << '\n';
        }
    }, variant);
}
带有类型擦除的

std::any也可以使用。或降低一级,f.i。与std::vector<std::variant<int, float, double>>

答案 1 :(得分:0)

您无法执行此操作,因为所有3种向量类型都不同。

但是,您可以使用std :: vector所需的必需抽象函数创建一个非模板的抽象类,然后为每种矢量类型实现它。

类似这样的东西:

struct Base
{
      int size() = 0;
};

template <typename T>
struct VectorWrapper : public Base
{
      std::vector<T>* mVector;
      int size() { return mVector.size(); }
};

int main()
{
     std::vector<int> v;
     // initialize vector

     VectorWrapper<int> w;
     w.mVector = &v;

     std::vector<Base*> all;
     all.push_back(&w)

     return 0; 
}