2016-01-28 12 views
10

libC++ का उपयोग करके I_shared सार्वजनिक अनुभाग में std::shared_ptr::make_shared() स्थिर सदस्य फ़ंक्शन का पता लगाता है। यह बहुत आसान है जब मैं पहले से ही std::shared_ptr की विशेषज्ञता के प्रकार उर्फ ​​परिभाषित किया है है:स्थिर सदस्य फ़ंक्शन shared_ptr

using T = int; 
using P = std::shared_ptr<T>; 
auto p = P::make_shared(123); // <=> std::make_shared<T>(123) 
static_assert(std::is_same< decltype(p), P >::value); 

मैं मानक अनुपालन के बारे में चिंता कर रहा हूँ, क्योंकि लेख (1, 2) के स्थिर सदस्य समारोह make_shared बारे में कुछ नहीं उल्लेख विश्वसनीय स्रोत से std::shared_ptr

क्या वर्तमान में फ़ंक्शन का उपयोग करने के लिए यह खराब पैराक्टिस है? क्यूं कर?

+1

क्या यह तथ्य नहीं है कि यह मानक में पर्याप्त पर्याप्त कारण नहीं है? –

+0

आपको पहले से ही पता है कि यह कार्य गैर-मानक है। क्या यह सिर्फ एक राय आधारित सवाल नहीं है? – Brian

+0

मैंने अभी मानक विनिर्देश की जांच की है और इसे वहां वर्णित नहीं किया गया है। यह कार्यान्वयन विशिष्ट की तरह दिखता है। यह वीएस2015 सी ++ मानक पुस्तकालय के साथ काम नहीं करता है। –

उत्तर

5

इस स्थिर make_shared सदस्य फ़ंक्शन का उपयोग करते समय आप g ++/इसकी मानक लाइब्रेरी के कार्यान्वयन-विशिष्ट एक्सटेंशन पर निर्भर करते हैं, जैसा कि आप पहले ही जानते हैं। इससे थोड़ा सा लाभ प्राप्त करने के लिए, मैं अपना कोड पोर्टेबल रखूंगा और std::make_shared का उपयोग करूंगा।

आपके द्वारा उल्लिखित मामले के लिए, यानी प्रतिलिपि बनाने या किसी मौजूदा निर्माता से कन्स्ट्रक्टर का उपयोग करके एक नई वस्तु का निर्माण करने के लिए, मैं एक वैकल्पिक (अवांछित; सी ++ 11-संगतता के लिए आपको एक पिछला रिटर्न प्रकार जोड़ना होगा) का सुझाव दे सकता हूं। :

template <typename T> 
auto share_ptr_to_new(T&& v) { 
    using T2 = typename std::remove_reference<T>::type; 
    return std::make_shared<T2>(std::forward<T>(v)); 
} 

उपरोक्त उदाहरण में, आप तो बस auto p = share_ptr_to_new(123) लिख सकते हैं।

+0

मेरे लिए वास्तव में बंद विकल्प [ओवरलोडिंग] है (http://coliru.stacked-crooked.com/a/f87c5e9131d5eda7) 'st_ :: shared_ptr' के लिए' make_shared' 'के लिए कहीं भी उपयोगकर्ता नामस्थान में कहीं भी। – Orient

3

Fwiw, वहाँ

template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args); 
एक गैर सदस्य समारोह के रूप में

है।

std::shared_ptr::make_shared के बजाय आपको std::make_shared का उपयोग करने में सक्षम होना चाहिए।

+0

यह मेरे लिए कॉपी-बुक मैक्सिम है और कई अन्य लोग हैं, जो सी ++ 14 के '' से निपटते हैं। – Orient

+0

@ ऑरेंट, मुझे यह समझ में नहीं आया। –

+1

कॉपी-बुक अधिकतम समानार्थी: सत्यवाद, सामान्य सत्य। – Orient

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