是否有可能讓一個成員是一個多維數組,其維度和範圍在運行時才知道?使用嵌套的std :: array創建一個多維數組,直到運行時才知道維度或範圍
我發現(通過this guide)的方式來創建一個結構來容易築巢的std ::使用模板元編程在編譯時數組:
#include <array>
/*
this struct allows for the creation of an n-dimensional array type
*/
template <typename T,size_t CurrentDimExtent,size_t... NextDimExtent>
struct MultiDimArray{
public:
//define the type name nestedType to be a recursive template definition.
using nestedType=typename MultiDimArray<T,NextDimExtent...>::type;
using type=std::array<nestedType,CurrentDimExtent>;
};
/*
This struct is the template specialization which handles the base case of the
final dimensional extent
*/
template <typename T,size_t DimExtent>
struct MultiDimArray<T,DimExtent>{
using type=std::array<T,DimExtent>;
};
這仍然未能在兩個方面滿足我的要求的(我知道的):
- 爲了聲明這種類型的變量(或指向變量的指針),你必須聲明尺寸。
- 只有當DimExtents是常量表達式(在編譯時設置)時纔有效。
爲了證明爲什麼數2是一個獨特的問題,這裏是用(2)一個void *尺寸的一組數來引用多維數組的類:
template <typename T>
class TwoDimGrid{
public:
TwoDimGrid(const size_t extent1,const size_t extent2):
_twoDimArray(new MultiDimArray<T,extent1,extent2>);
private:
void* _twoDimArray;
};
這不會編譯因爲extent1和extent2不是常量表達式。其他
筆記:
- 我想看看是否有可能使用std來完成:陣列,而不是天然的陣列或類似的std ::向量動態調整容器。
- 請在適當的地方使用智能指針(我沒有,因爲我真的不知道如何處理智能無效指針)。
編輯
我已經陷入了The XY Problem X是這個問題的第一句話和Y是如何使用的std ::陣列完成它的陷阱。因此,我創建了一個new question,並且在這裏可以解決Y問題。
的std ::陣列需要知道它在編譯時的大小,你不能把它演繹它在運行時,使用std: :vector – dchhetri
@ user814628即使使用std :: vector,我仍然會遇到在編譯時必須知道維數的問題。 –
你可以使用boost :: multi_array嗎? – dchhetri