तो मुझे लगता है कि एक मानक कंटेनर लपेटता एक टेम्पलेट है, यह मैं यथोचित आसानी से initializer_list निर्माता प्रतिनिधि कर सकते हैं लगता है , उदाहरण के लिए।वैकल्पिक रूप से टेम्पलेट्स के लिए initializer_list निर्माण का समर्थन शायद लपेटकर कंटेनर
int main(int argc, char* argv[]) {
holder<std::vector<int>> y{1,2,3};
return EXIT_SUCCESS;
}
लेकिन यह बहुत स्पष्ट रूप से 'int', या किसी भी अन्य प्रकार है कि एक नेस्टेड VALUE_TYPE typedef नहीं है के रूप में टी के लिए काम नहीं करता। इसलिए, मैं कुछ प्रकार की enable_if या इसी तरह की चाल का उपयोग करना चाहता हूं ताकि प्रारंभकर्ताइज़र_लिस्ट कन्स्ट्रक्टर को उत्सर्जित न किया जाए जब तक कि टी दोनों नेस्टेड वैल्यू टाइप टाइप टाइप नहीं किया जाता है, और std :: startizer_list से रचनात्मक है।
मैं निम्नलिखित की कोशिश की, लेकिन यह अभी भी काम नहीं करता, क्योंकि संकलक (बजना मेरे मामले में ++ 3.1), अभी भी अमान्य टी :: VALUE_TYPE जब टी पूर्णांक है से अधिक यात्राएं:
holder(typename std::enable_if<std::is_constructible<T, std::initializer_list<typename T::value_type>>::value, std::initializer_list<typename T::value_type>>::type values)
: t_(values) {}
कोई अवधारणा को व्यक्त करने के बारे में विचार "टी पर इस टेम्पलेट को टी के वैल्यू_ टाइप पर प्रारंभिक सूची कन्स्ट्रक्टर पर दें, अगर केवल तभी टी के पास value_type टाइपपीफ है और T :: value_type की प्रारंभकर्ता_सूची से रचनात्मक है"।
'initializer_list' सही मान द्वारा पारित, या यह कुछ संदर्भ प्रकार के आधार पर पारित किया जाना चाहिए है? ('&&'?) –
@ मार्टिनबा: मूल्य से गुजरना सही है (और अनुशंसित) 'std :: startizer_list' के लिए। –
एक 'startizer_list' में केवल एक पॉइंटर और आकार होता है, इसलिए इसे मूल्य से पास करना ठीक है। डेटा की प्रतिलिपि नहीं बनाई गई है। –