2013-06-15 17 views
7

हम सभी जानते हैं कि दोनों बूस्ट और सी ++ 11 में shared_ptr के लिए समर्थन है। कुछ कंपाइलर को सी ++ 11 के लिए समर्थन है जबकि कुछ नहीं करता है। मैं अपना कोड लिखना चाहता हूं ताकि जब संकलक समर्थन C++ 11 shared_ptr का समर्थन करता है, तो यह std :: shared_ptr का उपयोग करता है; जब ऐसा नहीं होता है, तो boost :: shared_ptr का उपयोग करें। इसके लिए आम/सर्वोत्तम अभ्यास क्या है?बूस्ट :: shared_ptr और std :: shared_ptr सह-अस्तित्व

मुझे चर्चा को जीसीसी में सीमित करने दें, लेकिन विशेष संस्करण के लिए नहीं।

+1

यदि आप ऐसी स्थिति में हैं, तो आप केवल * हमेशा * बूस्ट का उपयोग क्यों नहीं करते? –

+0

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/5213d735-58ca-452e-994f-cfc9575449a7/ – user1929959

+0

मुझे लगता है कि आपको सी ++ 11 उपलब्धता की जांच करनी चाहिए, जैसा कि आप कर सकते हैं http://stackoverflow.com/questions/1975616/determine-c0x- उपलब्धता में देखें। – user1929959

उत्तर

3

तुम बस उन्हें एक कस्टम नाम स्थान

#ifdef HAS_STD_SHARED_PTR 
    #include <memory> 
    #define SHARED_PTR_NAMESPACE std 
#else 
    #include <boost/shared_ptr.hpp> 
    #define SHARED_PTR_NAMESPACE boost 
#endif 

namespace my_namespace { 
    using SHARED_PTR_NAMESPACE::shared_ptr; 
    using SHARED_PTR_NAMESPACE::make_shared; 
} 

#undef SHARED_PTR_NAMESPACE 

HAS_STD_SHARED_PTR ध्वज का निर्माण पर्यावरण द्वारा निर्धारित करने की आवश्यकता में खींच सकते हैं। CMakedetecting such features के सामान्य तरीकों के लिए अनुमति देता है।

+0

आप सी ++ संस्करण की जांच भी कर सकते हैं, इसके लिए एक मैक्रो है: '__cplusplus' – stefan

+0

निश्चित है लेकिन यह आपको एक कंपाइलर तक सीमित कर देगा। सीएमके के साथ आप काम करने के लिए पहचान पर भरोसा कर सकते हैं भले ही आप किस कंपाइलर टूलचैन का उपयोग करते हों। – ComicSansMS

+0

@ कॉमिकसैनएमएस: नहीं, 'सी ++' का संस्करण '__cplusplus' में एन्कोड किया गया है और यह मानक afaik – stefan

4

C++ 0x/C++ 11 उपलब्धता

एक ही रास्ता जीसीसी C++ 0x/C++ 11 उपयोग कर रहा है कि क्या, आज के रूप में मैं पता लगाने के लिए जानकारी है, है पूर्वनिर्धारित के लिए जाँच करने के लिए मैक्रो __GXX_EXPERIMENTAL_CXX0X__:

#ifdef __GXX_EXPERIMENTAL_CXX0X__ 
    // C++11 code 
#else 
    // C++03 code 
#endif 

ध्यान दें कि यह भविष्य (मैक्रो की इसलिए EXPERIMENTAL हिस्सा) में बदल सकते हैं।

संपादित करें: वास्तव में एक बेहतर तरीका मैं का पता नहीं था जब तक @stephan यह एक टिप्पणी में कहा गया है:

16,8/1 [cpp.predefined]

__cplusplus 

नाम __cplusplus को परिभाषित किया गया है: निम्न मैक्रो नाम कार्यान्वयन से परिभाषित किया जाएगा मूल्य 201103L जब एक सी ++ अनुवाद इकाई संकलित करता है।

157) इसका उद्देश्य यह है कि इस मानक के भविष्य के संस्करण को इस मैक्रो के मूल्य को अधिक मूल्य के साथ प्रतिस्थापित करेंगे। गैर-अनुरूप कंपिलर को अधिकतम पांच दशमलव अंकों वाले मान का उपयोग करना चाहिए।

तो मुझे लगता है कि तुम कर सकते हो:

#if defined(__cplusplus) && (__cplusplus >= 201103L) 

लेकिन मुझे डर है इस पूर्व-मानक C++ 0x जीसीसी संस्करणों के साथ काम नहीं करेंगे। तो मैं शायद दोनों __GXX_EXPERIMENTAL_CXX0X__ और __cplusplus एक साथ उपयोग कर सकेंगे:

#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && (__cplusplus >= 201103L)) 

C++ 0x/C++ 11 अनुकूलता

हालांकि यह हमेशा सिर्फ है कि क्या सी का पता लगाने के लिए पर्याप्त नहीं हो सकता है ++ 0x/C++ 11 समर्थन सक्षम है: C++ 11 समर्थन ने पूरे जीसीसी संस्करणों में बहुत कुछ बदल दिया है, न केवल कोर भाषा स्तर पर बल्कि लाइब्रेरी स्तर पर भी।

#if (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ >= 5)) // for GCC 4.7+ 

स्विचिंग boost के बीच:

मेरे सबसे अच्छा शर्त है, जो कम से कम जीसीसी संस्करण आप सी ++ 11 समर्थन के लिए स्वीकार्य लगता है खोजने के लिए और जैसे एक जीसीसी संस्करण परीक्षण के साथ ऊपर परीक्षण गठबंधन करने के लिए किया जाएगा और std

अब boost::shared_ptr और std::shared_ptr के बीच स्विच करने के लिए यह थोड़ा बोझिल है क्योंकि सी ++ 03 टेम्पलेटेड टाइपपीफ का समर्थन नहीं करता है। एक के लिए मैं एक template struct में आवश्यक परिभाषाएँ लपेट होगा:

#if (defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && (__cplusplus >= 201103L))) \ 
     && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ >= 5)) 
    template<typename T> 
    struct my_shared_ptr { 
     typedef std::shared_ptr<T> type; 
     // you may also want to forward make_shared etc, this is left as an exercise 
    }; 
#else 
    template<typename T> 
    struct my_shared_ptr { 
     typedef boost::shared_ptr<T> type; 
     // you may also want to forward make_shared etc, this is left as an exercise 
    }; 
#endif 

my_shared_ptr<int>::type ptr(new int); 

संपादित करें: (फिर) ओह मैं सिर्फ @ एक सरल गैर टेम्पलेट using निर्देश के साथ सही shared_ptr आयात करने की ComicSansMS के रास्ते देखा। डुनो क्यों मैंने इसके बारे में नहीं सोचा था।

फिर भी, मैं जीसीसी पर सी ++ 0x/सी ++ 11 का पता लगाने के तरीके के साथ खड़ा हूं।

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