2010-05-30 12 views
5

इतनी के रूप में पोर्टेबिलिटी और रख-रखाव को अधिकतम करने के 0x टेम्पलेट्स संयोजन के रूप में autoconf का उपयोग कर shared_ptr और अन्य TR1/बूस्ट सी ++ के साथ के लिए सर्वोत्तम प्रथाओं क्या हैं?C++ 0x साथ autoconf का उपयोग कैसे करें सुविधाएँ

autoconf साथ

मैं निर्धारित कर सकते हैं कि क्या shared_ptrstd::tr1::shared_ptr और/या boost::shared_ptr रूप उपलब्ध है। यह देखते हुए है कि एक ही सुविधा दो अलग-अलग नाम है, मैं निम्नलिखित प्रश्न हैं:

  1. कोड में, कैसे shared_ptr संदर्भित किया जाना चाहिए?
  2. std::tr1::shared_ptrboost::shared_ptr से अधिक पसंद किया जाना चाहिए?

पहले के लिए, कोड वर्तमान में पूर्वप्रक्रमक सशर्त, की इजाजत दी गैर योग्य संदर्भ shared_ptr लिए उपयोग कर रहा है, एक ला

#if HAVE_STD_TR1_SHARED_PTR 
using std::tr1::shared_ptr; 
#elif HAVE_BOOST_SHARED_PTR 
using boost::shared_ptr; 
#else 
#error "No definition for shared_ptr found" 
#endif 

दूसरा, कोड boost:: से अधिक std::tr1:: का उपयोग करता है बाह्य पुस्तकालयों पर निर्भरता कम करने के लिए (भले ही पुस्तकालय व्यापक रूप से उपयोग किए जाते हैं)।

क्या ये दो समाधान आम हैं? क्या बेहतर लोग हैं?

#if HAVE_STD_TR1_SHARED_PTR 
    template <class T> 
    struct SharedPtr { 
     typedef std::tr1::shared_ptr<T> Type; 
    }; 
#elif HAVE_BOOST_SHARED_PTR 
    template <class T> 
    struct SharedPtr { 
     typedef boost::shared_ptr<T> Type; 
    }; 
#else 
# error "No definition for shared_ptr found" 
#endif 

// Declare a shared_ptr using our wrapper classes, saving us from having to care 
// where shared_ptr comes from: 
SharedPtr<int>::Type my_shared_int(new int(42)); 

इस के साथ मुख्य समस्या यह है :: प्रकार संकेतन का उपयोग करने की आवश्यकता है: अपने उदाहरण कोड को

उत्तर

3

ही एक सुधार, और अपने पहले प्रश्न का उत्तर, "template typedef" मुहावरा उपयोग करने के लिए है । यह पूरी तरह से है क्योंकि सी ++ में वर्तमान में टेम्पलेट के लिए टाइपपीफ रखने का कोई तरीका नहीं है। आपके पास टेम्पलेट प्रकार इंस्टेंस के लिए टाइपिफ़ हो सकता है, लेकिन यहां यह महत्वपूर्ण है कि हम सामान्यता बनाए रखें।

चाहे आपको बूस्ट को TR1 पसंद करना चाहिए, मैं हाँ कहूंगा। अब संकलक आंशिक सी ++ 0x समर्थन के साथ शिपिंग कर रहे हैं, मैं कहूंगा कि आपको std :: shared_ptr के लिए भी परीक्षण करना चाहिए और अन्य लोगों में से किसी एक को पसंद करना चाहिए।

यदि आपको ऐसे कंपाइलर्स हैं जिन्हें साझा_प्टर है जो कहीं और है तो आपको चौथी टाइपिफ़ की आवश्यकता हो सकती है। मुझे ऐसे कंपाइलर के बारे में पता नहीं है, लेकिन कुछ सी ++ कोड जो मैं बनाए रखता हूं, वह कुछ समान है जो आप सिंगल-लिंक्ड सूचियों के लिए मानक सी ++ लाइब्रेरी में सामान्य slist एक्सटेंशन के बारे में पूछ रहे हैं। पुराने जी ++ संस्करणों ने इसे वैश्विक नेमस्पेस पर रखा है, आधुनिक जी ++ इसे कंपाइलर-विशिष्ट __gnu_cxx नेमस्पेस में रखता है, और हमें यह भी मिला है कि इसे गलती से std में रखा गया है!

+0

मुझे नहीं पता कि आपका टेम्पलेट टाइपपीफ मूल पोस्टर के सुझाव से परे क्या जोड़ता है। वह shared_ptr के साथ "दूषित" चीजें हैं। आपने SharePtr :: टाइप के साथ प्रदूषित चीजें बनाई हैं। दोनों बराबर लगते हैं, और उनमें कम टाइपिंग शामिल है। आपकी टेम्पलेट टाइपपीफ मूल पोस्ट में उपयोग कथन से परे क्या करती है? –

+0

आपने इसे मारा: अब आपको इन नामों को वैश्विक नामस्थान में उछालने की आवश्यकता नहीं है। मेरी विधि जरूरी नहीं है कि वैश्विक नाम जोड़ें; यदि आप चाहें तो आप इसे नाम दे सकते हैं। और यदि आप नहीं करते हैं, तो मेरी लाइब्रेरी में नामों के साथ संघर्ष करने की संभावना बहुत कम है। –

+0

यह देखते हुए कि shared_ptr अंततः std :: में होगा और वह autoconf निर्धारित कर सकता है कि किस नामस्थान share_ptr को परिभाषित किया गया है, मैं "नेमस्पेस std { :: shared_ptr;} का उपयोग कर झुका रहा हूं" यदि कोई std :: shared_ptr परिभाषित नहीं है। – themis

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