18

में बहु-आयामी सरणी को स्पष्ट रूप से परिभाषित करें T[][][] सिंटैक्स का उपयोग करके बहु-आयामी सरणी को परिभाषित करना आसान है। हालांकि, यह एक कच्चे सरणी प्रकार बनाता है जो आधुनिक सी ++ में अच्छी तरह फिट नहीं होता है। यही कारण है कि हमारे पास C12+ 11 के बाद std::array है। लेकिन std::array का उपयोग कर बहु-आयामी सरणी को परिभाषित करने के लिए वाक्यविन्यास काफी गन्दा है। उदाहरण के लिए, एक त्रि-आयामी int सरणी को परिभाषित करने के लिए, आपको std::array<std::array<std::array<int, 5>, 5>, 5> लिखना होगा। वाक्यविन्यास बिल्कुल स्केल नहीं करता है। मैं इस मुद्दे के लिए एक फिक्स मांग रहा हूँ। शायद, इस समस्या को C++ द्वारा प्रदान की गई मौजूदा उपयोगिता का उपयोग करके ठीक नहीं किया जा सकता है। उस स्थिति में, मैं वाक्यविन्यास को कम करने के लिए विकसित एक कस्टम टूल से खुश हूं।आधुनिक सी ++

मिले एक solution अपने आप:

template <typename T, std::size_t n, std::size_t... ns> 
struct multi_array { 
    using type = std::array<typename multi_array<T, ns...>::type, n>; 
}; 

template <typename T, std::size_t n> 
struct multi_array<T, n> { 
    using type = std::array<T, n>; 
}; 

template <typename T, std::size_t... ns> 
using multi_array_t = typename multi_array<T, ns...>::type; 

सोच कार्यान्वयन आगे सरल किया जा सकता है या नहीं।

+3

[बूस्ट.मल्टी एरे] (http://www.boost.org/doc/libs/1_60_0/libs/multi_array/doc/user.html#sec_example) बचाव के लिए? –

+0

@AngryLettuce मुझे लगता है कि इस तरह के साधारण मामलों के लिए थोड़ा बहुत भारी होगा। मैं सिर्फ इसके लिए पूरे बूस्ट में नहीं खींचना चाहता हूं। – Lingxi

+0

क्या 'typedef' स्वीकार्य नहीं है:' typedef std :: array >> तीन डी; '..' तीन डी arr; एआर [0] [0] [0] ... '? इस उदाहरण को अलग-अलग प्रकारों की अनुमति देने के लिए संशोधित करना होगा, जाहिर है, लेकिन जिज्ञासा अगर इससे मदद मिल सकती है? – txtechhelp

उत्तर

7

Multi-dimensional arrays in C++11

template <class T, std::size_t I, std::size_t... J> 
struct MultiDimArray 
{ 
    using Nested = typename MultiDimArray<T, J...>::type; 
    // typedef typename MultiDimArray<T, J...>::type Nested; 
    using type = std::array<Nested, I>; 
    // typedef std::array<Nested, I> type; 
}; 

template <class T, std::size_t I> 
struct MultiDimArray<T, I> 
{ 
    using type = std::array<T, I>; 
    // typedef std::array<T, I> type; 
}; 

MultiDimArray<float, 3, 4, 5, 6, 7>::type floats; 

MultiDimArray का संदर्भ लें के लिए बहु-आयामी std::array नेस्टेड प्रकार गणना करने के लिए मेटा-कार्यों की एक जोड़ी है। सबसे सामान्य MultiDimArray मनमानी संख्याओं को पारित करने के लिए हस्ताक्षरित पूर्णांक का एक भिन्न टेम्पलेट है। समाप्ति MultiDimArray विशेषज्ञता एकल आयामी std::array के सबसे सरल मामले को परिभाषित करती है।

+0

कार्यान्वयन और सरलीकृत किया जा सकता है? – Lingxi

संबंधित मुद्दे