2017-01-02 12 views
7

में नेमस्पेस उपनाम मैं C++ 11 का उपयोग करता हूं जबकि मुझे C++ 17 लाइब्रेरी से कुछ कक्षाओं की आवश्यकता होती है। बढ़ावा जहाँ से कक्षाएं जोड़ा गया था का उपयोग करते समय मैं निम्नलिखित करना चाहते हैं:सी ++

#if __cplusplus < CPP17 
using std::any = boost::any; 
#endif 

इस तरह उर्फ ​​अनुमति नहीं है। एसडीडी नेमस्पेस को विस्तारित करने के कारण undefined behaviour का कारण बनता है। मैं चाहता हूं कि मेरा कोड सी ++ संस्करण के समान संबंधों को देखना चाहें। क्या कोई स्पष्ट तरीका है?

+5

बस अपना नाम इस्तेमाल करें और आवश्यकतानुसार 'boost :: any' या' std :: any' असाइन करें? –

उत्तर

6

स्पष्ट तरीका यह है कि इसके लिए एक अनुकूलित नाम जोड़ना है।

#if __cplusplus < CPP17 
using my_any = boost::any; 
#else 
using my_any = std::any;  
#endif 

// using my_any... 
+0

मैं C++ 17 संगतता के लिए std :: किसी का उपयोग करना चाहता हूं। – Ariel

+1

@ एरियल जैसा कि आपने महसूस किया है, कानूनी रूप से std नेमस्पेस को "संशोधित" करना संभव नहीं है। – songyuanyao

6

ऐसा लगता है कि आप नामस्थान के भीतर एक प्रकार का उपनाम बनाने का प्रयास कर रहे हैं। उस के लिए corect वाक्य रचना है:

namespace namespace_name { 
    using any = boost::any; 
} 

हालांकि, मानक जोड़ने की अनुमति नहीं देता परिभाषाएँ, std नेम स्पेस में (टेम्पलेट विशेषज्ञताओं के लिए अपवाद हैं) इसलिए यदि आप std::any को परिभाषित करने की कोशिश की, अपने कार्यक्रम के व्यवहार अपरिभाषित कर दिया जाएगा।

वैश्विक नाम सहित किसी भी नामस्थान का उपयोग करना ठीक है, लेकिन कार्यान्वयन के लिए आरक्षित नहीं है, जिसमें std और इसके उपनाम स्थान शामिल हैं।

+0

मैंने std नेमस्पेस में परिभाषाओं को जोड़ने की कोशिश की और इसे संकलित किया गया। – Ariel

+3

@ एरियल मैंने अपना जवाब संशोधित किया है। 'Std' में परिभाषाएं प्रोग्राम को खराब नहीं बनाती हैं, यह व्यवहार को अपरिभाषित बनाती है। उस ने कहा, बीमार होने के कारण कार्यक्रम को संकलित करने से रोकने की गारंटी नहीं है। – user2079303

+0

यह बहुत दुखी है कि जब मैं पुराने सी ++ संस्करण से नए में स्विच करता हूं तो मुझे 'std' में सभी 'बूस्ट' को बदलना होगा। – Ariel

0

मुझे अपरिभाषित व्यवहार चिंताओं के साथ बड़ा सौदा नहीं दिख रहा है। आप पहले से ही सी ++ 17 की जांच के लिए #if का उपयोग करते हैं, और आप जानते हैं कि इससे पहले any नहीं है। यदि आप वास्तव में यह चाहते हैं, तो मैं कहता हूं कि इसके लिए जाएं, और उपनाम को std में रखें यदि यह C++ 17 से पहले है।

दिन के अंत में, सहायक कार्य/कक्षाएं/आदि को किसी अन्य नामस्थान में रखा जाएगा या __ के साथ उपसर्ग किया जाएगा क्योंकि यह मानक पुस्तकालयों के लिए उपलब्ध है। मुझे लगता है कि पूर्व-सी ++ 17 निर्यात any std में कोई कार्यान्वयन नहीं है।

कोई अन्य तरीका नहीं है। बस "अपरिभाषित व्यवहार" को अनदेखा करें और यदि यह काम करता है तो इसके लिए जाएं। आपके कोड को बर्बाद करने के बारे में जादुई कुछ भी नहीं है; सबसे बुरा यह हो सकता है कि एक खराब std कार्यान्वयन संघर्ष करेगा और जब आप उपनाम को परिभाषित करते हैं तो संकलित करने में असफल हो जाते हैं। कुछ लोग मेरी राय में अपरिभाषित व्यवहार के मुद्दों को खत्म करते हैं।