इतनी के रूप में पोर्टेबिलिटी और रख-रखाव को अधिकतम करने के 0x टेम्पलेट्स संयोजन के रूप में autoconf
का उपयोग कर shared_ptr
और अन्य TR1/बूस्ट सी ++ के साथ के लिए सर्वोत्तम प्रथाओं क्या हैं?C++ 0x साथ autoconf का उपयोग कैसे करें सुविधाएँ
autoconf
साथ
मैं निर्धारित कर सकते हैं कि क्या shared_ptr
std::tr1::shared_ptr
और/या boost::shared_ptr
रूप उपलब्ध है। यह देखते हुए है कि एक ही सुविधा दो अलग-अलग नाम है, मैं निम्नलिखित प्रश्न हैं:
- कोड में, कैसे
shared_ptr
संदर्भित किया जाना चाहिए? std::tr1::shared_ptr
boost::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));
इस के साथ मुख्य समस्या यह है :: प्रकार संकेतन का उपयोग करने की आवश्यकता है: अपने उदाहरण कोड को
मुझे नहीं पता कि आपका टेम्पलेट टाइपपीफ मूल पोस्टर के सुझाव से परे क्या जोड़ता है। वह shared_ptr के साथ "दूषित" चीजें हैं। आपने SharePtr :: टाइप के साथ प्रदूषित चीजें बनाई हैं। दोनों बराबर लगते हैं, और उनमें कम टाइपिंग शामिल है। आपकी टेम्पलेट टाइपपीफ मूल पोस्ट में उपयोग कथन से परे क्या करती है? –
आपने इसे मारा: अब आपको इन नामों को वैश्विक नामस्थान में उछालने की आवश्यकता नहीं है। मेरी विधि जरूरी नहीं है कि वैश्विक नाम जोड़ें; यदि आप चाहें तो आप इसे नाम दे सकते हैं। और यदि आप नहीं करते हैं, तो मेरी लाइब्रेरी में नामों के साथ संघर्ष करने की संभावना बहुत कम है। –
यह देखते हुए कि shared_ptr अंततः std :: में होगा और वह autoconf निर्धारित कर सकता है कि किस नामस्थान share_ptr को परिभाषित किया गया है, मैं "नेमस्पेस std { :: shared_ptr;} का उपयोग कर झुका रहा हूं" यदि कोई std :: shared_ptr परिभाषित नहीं है। –
themis