模板化向量的向量

use*_*163 6 c++ templates vector

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

std::vector<int> v1;
std::vector<float> v2;
std::vector<double> v3;

std::vector<SomeType> all;
all.push_back(v1);
all.push_back(v2);
all.push_back(v3);
Run Code Online (Sandbox Code Playgroud)

SomeType在这种情况下应该怎么办?

我的实际用例:

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

One*_*uad 5

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

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);
}
Run Code Online (Sandbox Code Playgroud)

std::any使用类型擦除也可以。或按降低一级std::vector<std::variant<int, float, double>>。


小智 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; 
}
Run Code Online (Sandbox Code Playgroud)