2013-11-03 14 views
6

प्रारंभ करने के लिए प्रारंभकर्ता-सूची प्रारंभिक-सूची के माध्यम से नेस्टेड (2 डी) std::array प्रारंभ करने के लिए कैसे करें?2 डी std :: सरणी सदस्य

template <std::size_t W, std::size_t H> 
class Block 
{ 
    std::array<std::array<int, W>, H> block; 
public: 

    template <typename ...E> 
    Block(E&&...e) : block {{std::forward<E>(e)...}} {} 
}; 

वर्ग Block चाहिए के रूप में नीचे block सदस्य को प्रारंभ करने में सक्षम:

Block<3, 2> b {{ {1, 2, 3}, {4, 5, 6} }}; 

नोट:

std::array<std::array<int, 3>, 2> b {{ {1, 2, 3}, {4, 5, 6} }}; 
: हम सी ++ 11 में सीधे std::array प्रारंभ करने की क्षमता है

मैं जीसीसी -4.9.0

का उपयोग कर रहा हूँ
+0

बनाने 'तक block' निजी और एक ctor,' Block' अब isn 'उपलब्ध कराने के एक और अधिक नहीं। चूंकि ब्रेसिड-शुरुआतीकर्ताओं को कभी भी नहीं लिया जाता है, 'ब्लॉक <3,2>' प्रकार के ऑब्जेक्ट के लिए प्रारंभिक वैध केवल 'ब्लॉक <3,2> बी {1,2,3,4,5,6} ' – dyp

+0

पुन: संशोधन के लिए इसे वापस रोल करें जवाब के लिए समझ में आता है, फिर एक नया सवाल पूछें। – Shog9

उत्तर

5

घोंसले के ढांचे के लिए ब्रेसिज़ के नियम बहुत जटिल होते हैं।

अपने कोड में सरलतम रूप यह होगा:

Block<3, 2> b {1, 2, 3, 4, 5, 6}; 

मूल रूप से सभी आंतरिक ब्रेसिज़ — इन चूक भाषा द्वारा अनुमति दी जाती है को छोड़ देता है यही कारण है कि।

अगले वाक्य रचना, जो थोड़ा जटिल है, यह है:

Block<3, 2> b {{1, 2, 3, 4, 5, 6}}; 

यह अभी भी ब्रेसिज़ को छोड़ देता है, लेकिन जहां तक ​​Block के रूप में और के रूप में अपने सदस्य का संबंध है यह पूरी तरह से braced है। यह array और उसके सदस्यों के लिए ब्रेसिज़ को छोड़ देता है।

और यह एक पूरी तरह braced है:

Block<3, 2> b {{{ {{1, 2,3}}, {{4,5,6}} }}}; 

यह सब आंतरिक संरचनाओं के लिए धनुकोष्ठक।

All forms compiles fine

1

यह मानक overly std::array प्रारंभ करने के लिए आवश्यक ब्रेसिज़ की संख्या के साथ मनमौजी जा रहा है की व्याख्या से कोई लेना देना हो सकता है:

विस्तृत विवरण के लिए मेरे अन्य उत्तर देखें।

Block<3, 2> b { 
       { 
       { 
       { {1, 2, 3} }, { {4, 5, 6} } 
       } 
       } 
       }; 

अजीब, इस संस्करण भी संकलित: यह पूरी तरह से braced संस्करण जीसीसी 4.8.1 पर मुद्दों के बिना संकलित

Block<3, 2> b { 
       {{ {1, 2, 3}, {4, 5, 6} } } 
       }; 
+1

@ एमएम। कोई बात नहीं। यह अभी भी मुझे कोई समझ नहीं आता है। वैसे भी, मुझे लगता है कि आपका पहला प्रयास सी ++ 14 में कानूनी होना चाहिए। – juanchopanza

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