作為一個練習,我想構造一個包含std::array<unsigned char, N>物件(N不同的地方)的向量。
我的嘗試是建立一個基類,GenericArray從中MyArray<N>會得到,使得該容器實際上是:std::vector<GenericArray*>。但是,由于實際的陣列變數必須駐留在派生類中,因此我看不到從std:vector<GenericArray*>自身中使用這些資料的方法。
這是我的全部嘗試,顯然會產生: error: ‘class GenericArray’ has no member named ‘data’
#include <array>
#include <cassert>
#include <iostream>
#include <vector>
template<std::size_t N>
using arr_t = std::array<unsigned char, N>;
class GenericArray
{
public:
~GenericArray() = default;
};
template<std::size_t N>
class MyArray : public GenericArray
{
public:
arr_t<N> data;
MyArray(const arr_t<N>& data)
{
this->data = data;
}
};
int main(void)
{
std::vector<GenericArray*> vs;
vs.emplace_back(new MyArray<2>({ 'a', 'b' }));
vs.emplace_back(new MyArray<4>({ 'A', 'B', 'C', 'D' }));
assert(vs.size() == 2);
for (const auto& x : vs[0]->data)
{
std::cout << x << "\n";
}
return 0;
}
uj5u.com熱心網友回復:
你似乎混合了兩個概念。我推薦 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';
}
}```
uj5u.com熱心網友回復:
我想構造一個包含 std::array<unsigned char, N> 物件(其中 N 不同)的向量。
你不能。向量,就像所有標準容器一樣,是同質的。它們由單一元素型別組成。std::array<unsigned char, N>和std::array<unsigned char, M>是不同的型別 - 假設 N != M,因此它們不能存盤在同質容器中。
你可以std::vector<std::vector<unsigned char>>改用。
uj5u.com熱心網友回復:
我不認為這是可能的。假設您使用方法創建了一個包含std::array<char,N>s secvence 的類get。回傳結果的大小應該是多少。編譯器必須知道所有用于編譯的變數的記憶體大小,但它不知道auto p=vct.get(i);
If get 回傳指標的大小,而auto p=*vct.get(i);不是未定義的大小大小。
您可以獲得的最接近的是回傳void*并將其強制轉換為array<char,N>*但 N 必須在編譯時已知
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325443.html
下一篇:GMockstd::any引數
