不同大小的 std::array 的 std::vector

Ale*_*inu 1 c++ containers

作为练习,我想构造一个包含std::array<unsigned char, N>对象(其中N不同)的向量。

\n

我的尝试是构造一个基类, GenericArraya 将从该基类MyArray<N>派生,这样容器实际上将是:std::vector<GenericArray*>。但是,由于实际的数组变量必须驻留在派生类中,因此我没有找到从其本身使用这些数据的方法std:vector<GenericArray*>

\n

这是我的完整尝试,显然会产生:error: \xe2\x80\x98class GenericArray\xe2\x80\x99 has no member named \xe2\x80\x98data\xe2\x80\x99

\n
#include <array>\n#include <cassert>\n#include <iostream>\n#include <vector>\n\ntemplate<std::size_t N>\nusing arr_t = std::array<unsigned char, N>;\n\nclass GenericArray\n{\npublic:\n    ~GenericArray() = default;\n};\n\ntemplate<std::size_t N>\nclass MyArray : public GenericArray\n{\npublic:\n    arr_t<N> data;\n\n    MyArray(const arr_t<N>& data)\n    {\n        this->data = data;\n    }\n};\n\nint main(void)\n{\n    std::vector<GenericArray*> vs;\n\n    vs.emplace_back(new MyArray<2>({ \'a\', \'b\' }));\n    vs.emplace_back(new MyArray<4>({ \'A\', \'B\', \'C\', \'D\' }));\n\n    assert(vs.size() == 2);\n\n    for (const auto& x : vs[0]->data)\n    {\n        std::cout << x << "\\n";\n    }\n\n    return 0;\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

Ted*_*gmo 6

您似乎混淆了两个概念。我推荐 eerorika 的答案中的版本,但如果您确实想要在容器中使用基类指针,这里有一种方法:

#include <array>
#include <iostream>
#include <vector>
#include <memory>

class GenericArray {
public:
    using value_type = unsigned char;
    using iterator = value_type*;

    template<std::size_t N>
    using arr_t = std::array<value_type, N>;

    virtual ~GenericArray() = default; // must be virtual to call the derived dtor
    virtual iterator begin() = 0;      // used for iterating in the derived class
    virtual iterator end() = 0;
    // add `const` versions too as needed
};

template<std::size_t N>
class MyArray : public GenericArray {
public:
    arr_t<N> data;

    MyArray(const arr_t<N>& data) : data(data) {}
    iterator begin() override { return data.data(); }             // overridden
    iterator end() override { return data.data() + data.size(); } // -"-
};

int main() {    // no need for main(void)
    std::vector<std::unique_ptr<GenericArray>> vs;

    vs.emplace_back(new MyArray<2>({ 'a', 'b' }));
    vs.emplace_back(new MyArray<4>({ 'A', 'B', 'C', 'D' }));

    // loop over the elements:
    for(auto& ptr : vs) {
        for(auto& x : *ptr) std::cout << x << ' ';
        std::cout << '\n';
    }
}```
Run Code Online (Sandbox Code Playgroud)


eer*_*ika 5

我想构造一个包含 std::array<unsigned char, N> 对象(其中 N 不同)的向量。

你不能。与所有标准容器一样,向量是同构的。它们由单一元素类型组成。std::array<unsigned char, N>std::array<unsigned char, M>是不同的类型 - 假设 N != M,因此它们不能存储在同质容器中。

你可以用std::vector<std::vector<unsigned char>>它代替。