यदि आपका कंपाइलर 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)...));
}
variadic टेम्पलेट्स के बिना, आप 'make_shared' के कई संस्करण की आवश्यकता होगी, शून्य तर्क के लिए एक, एक तर्क के लिए एक, दो तर्क के लिए एक , आदि –
आप किस कंपाइलर का उपयोग कर रहे हैं? – jalf
@ बेनवॉइग: वैराडिक टेम्पलेट्स एक बड़े पैमाने पर ठोकर नहीं हैं, हालांकि। रैवल्यू संदर्भों की अनुपस्थिति C++ 03 में 'make_shared' कम शक्तिशाली बनाती है, लेकिन आपके पास अभी भी एकल-आवंटन कार्यान्वयन अनुकूलन, साथ ही अपवाद-सुरक्षित रूप से एक फैक्ट्री फ़ंक्शन प्रदान करता है। –