2012-02-03 15 views
5

जबकि मेरे पास मेरे संकलक में std::tr1::shared_ptr<T> उपलब्ध है, मैं make_shared नहीं है।सी ++ make_shared उपलब्ध नहीं

क्या कोई मुझे make_shared के उचित कार्यान्वयन के लिए इंगित कर सकता है? मैं देखता हूं कि मुझे टी

के कन्स्ट्रक्टर को तर्क प्रदान करने के लिए varargs का उपयोग करने की आवश्यकता है, लेकिन मेरे पास मेरे कंपाइलर में भी विविध टेम्पलेट उपलब्ध नहीं हैं।

+2

variadic टेम्पलेट्स के बिना, आप 'make_shared' के कई संस्करण की आवश्यकता होगी, शून्य तर्क के लिए एक, एक तर्क के लिए एक, दो तर्क के लिए एक , आदि –

+0

आप किस कंपाइलर का उपयोग कर रहे हैं? – jalf

+0

@ बेनवॉइग: वैराडिक टेम्पलेट्स एक बड़े पैमाने पर ठोकर नहीं हैं, हालांकि। रैवल्यू संदर्भों की अनुपस्थिति C++ 03 में 'make_shared' कम शक्तिशाली बनाती है, लेकिन आपके पास अभी भी एकल-आवंटन कार्यान्वयन अनुकूलन, साथ ही अपवाद-सुरक्षित रूप से एक फैक्ट्री फ़ंक्शन प्रदान करता है। –

उत्तर

6

यदि आपका कंपाइलर make_shared का कार्यान्वयन नहीं करता है और आप बूस्ट का उपयोग नहीं कर सकते हैं, और आप ऑब्जेक्ट और संदर्भ काउंटर दोनों के लिए एकल-आवंटन अनुकूलन की कमी को ध्यान में रखते हैं तो make_shared इस तरह कुछ है :

variadic टेम्पलेट समर्थन के बिना:

// zero arguments version 
template <typename T> 
inline shared_ptr<T> make_shared() 
{ 
    return shared_ptr<T>(new T()); 
} 

// one argument version 
template <typename T, typename Arg1> 
inline shared_ptr<T> make_shared(Arg1&& arg1) 
{ 
    return shared_ptr<T>(new T(std::forward<Arg1>(arg1))); 
} 

// two arguments version 
template <typename T, typename Arg1, typename Arg2> 
inline shared_ptr<T> make_shared(Arg1&& arg1, Arg2&& arg2) 
{ 
    return shared_ptr<T>(new T(std::forward<Arg1>(arg1), 
          std::forward<Arg2>(arg2))); 
} 

// ... 

अपने संकलक आर-मूल्य संदर्भ का समर्थन नहीं करते, तो करते हैं तो प्रत्येक तर्क के लिए 2 संस्करण गिनती: एक स्थिरांक Arg & और एक Arg &

variadic टेम्पलेट समर्थन साथ :

template <typename T, typename... Args> 
inline shared_ptr<T> make_shared(Args&&... args) 
{ 
    return shared_ptr<T>(new T(std::forward<Args>(args)...)); 
} 
+0

दोनों को घटा सकता है, गिगी के विविध संस्करण भी यहां चर्चा के अनुसार एक उचित बैकट्रैक छोड़ देता है: http://stackoverflow.com/questions/9233358/debuggable-replacement- के लिए बनाने से साझा की गई – srking

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