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在这种情况下应该怎么办?
我的实际用例:
我有不同数据类型的向量,需要将它们写到磁盘上。每次我向数据集添加一列时,我都不必在各个不同位置指定该列。我希望能够轻松地遍历各列。
有多种方法可以执行此操作,具体取决于您的情况。这是带有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)