2010-07-22 33 views
8

मान लीजिए कि आप एक टेम्पलेट वर्ग के एक C++ 0x std :: सरणी सदस्य है और आप एक निर्माता कि iterators का समय लगता है के माध्यम से यह प्रारंभ करना चाहते हैं पर:एसटीडी का प्रारंभ :: सरणी

template <typename Tp, size_t N> 
class Test 
{ 
public: 
    template <typename Iterator> 
    Test(Iterator first, Iterator last) 
    { 
     if (std::distance(first,last) > N) 
      throw std::runtime_error("bad range"); 
     std::copy(first, last, _M_storage.begin()); 
    } 

private: 
    std::array<Tp, N> _M_storage; 

}; 

मान लीजिए कि आप अपने स्टोरेज के आकार के साथ एक रेंज प्रदान कर रहे हैं, क्या स्टोरेज में टीपीएस के सुपरफ्लस डिफॉल्ट कन्स्ट्रक्टर से परहेज करते हुए, कन्स्ट्रक्टर प्रारंभकर्ता में std :: array को प्रारंभ करना संभव है? क्या इस मामले में std :: startizer_list <> का फायदा उठाना संभव है?

+1

वैसे, एक पहचानकर्ता जो अंडरस्कोर से शुरू होता है और उसके बाद पूंजी पत्र आरक्षित होता है। इसके अलावा, यह 'std :: दूरी (पहला, अंतिम) होना चाहिए। – GManNickG

+0

ओवरसइट तय। अतिरिक्त डिफ़ॉल्ट रचनाकारों के साथ समस्या बनी हुई है ... –

उत्तर

3

सं

std::array एक समग्र है, तो आप iterators लेने कंस्ट्रक्टर्स की तरह कोई विशेष कार्यक्षमता प्राप्त। (यह वास्तव में मुझे आश्चर्य करता है, std::initializer_list की शुरूआत के साथ मुझे अन्य उपयोगी रचनाकार बनाने में कोई हानि नहीं दिखाई देती है। शायद एक प्रश्न स्टोर में है।)

इसका मतलब है कि सरणी के अंदर डेटा कॉपी करने के लिए इटरेटर का उपयोग करने का एकमात्र तरीका पुनरावृत्त करना है , और ऐसा करने के लिए कि array पहले से ही बनाया जाना चाहिए और उपयोग करने के लिए तैयार होना चाहिए।

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