2011-01-13 16 views
29

मैंने शुरू में सोचा कि वे सभी समान हैं, लेकिन यह गलत साबित हुआ। तो क्या कोई इन तीनों के बीच मतभेदों को संक्षेप में समझा सकता है?std, tr1 और boost (नामस्थान और/या पुस्तकालयों के रूप में) के बीच अंतर क्या हैं?

  1. std::bind (नवीनतम ही, सी ++ की अगली पीढ़ी)
  2. std::tr1::bind (वर्ष, सी के विस्तार ++ एसटीडी)
  3. boost::bind (पूरी तरह से अलग पुस्तकालय)

या std::shared_ptr, std::tr1::shared_ptr: उदाहरण के लिए , और boost::shared_ptr, ... आदि

अद्यतन

bind, shared_ptr ऐसे उदाहरण हैं जो मेरे प्रश्न को स्पष्ट करने में मदद करते हैं। मेरा इरादा उन तीन नामस्थानों के बीच सामान्य मतभेदों को समझना था। कई पुस्तकालय हैं जो सभी तीन नामस्थानों में मौजूद हैं, और जाहिर है bind एक उदाहरण है, साथ ही shared_ptr है।

मुझे किस नामस्थान के साथ रहना चाहिए? मैं व्यक्तिगत रूप से std:: से पुस्तकालय पसंद करता हूं क्योंकि यह सी ++ (सी ++ 0x) का अगला मानक होगा।

+4

प्रश्न बदलें - "बाइंड" जोड़ें, प्रश्न बताता है कि आप सामान्य – peenut

+0

@पेनट में पुस्तकालयों के बीच अंतर चाहते हैं, वह * सामान्य अंतर के बारे में स्पष्ट रूप से पूछ रहे हैं। –

+0

आपको स्पष्टीकरण की आवश्यकता है। क्या आपको वास्तव में लगता है कि 'बूस्ट :: वेक्टर' या 'बूस्ट :: कोउट' है? आप वास्तव में क्या जानना चाहते हैं? –

उत्तर

28

1 - std::bind इसके लिए मानक नाम है। यह वह नाम होगा जिसका उपयोग आप सी ++ 11 अनुपालन पुस्तकालयों के लिए करते हैं। सभी libraries in standardized C++ की सूची।

2 - std::tr1::bind सी ++ तकनीकी रिपोर्ट 1 नामस्थान है। सी ++ 03 और सी ++ 11 के बीच C++ Technical Report 1 था, जिसने अतिरिक्त पुस्तकालयों और संवर्द्धन का प्रस्ताव दिया था। इनमें से अधिकांश उस समय बूस्ट में पहले से मौजूद थे, और इनमें से कुछ लाइब्रेरी परिवर्तन C++ 11 मानक में <regex> और <functional> (जिसमें std::bind शामिल हैं) में अपनाया गया था। std::tr1 नामस्थान का उपयोग std नामस्थान में मानकीकृत सबकुछ के विपरीत, उनके कार्य-प्रगतिशील स्थिति में पुस्तकालयों को अलग करने के लिए किया गया था।

3 - अगर आप Boost पुस्तकालय का उपयोग कर रहे boost::bind, boost नाम स्थान में bind के लिए है। बूस्ट टीआर 1 में क्या है और सी ++ 11 की एसडीडी लाइब्रेरी में क्या है उससे कहीं अधिक है। की सूची सभी libraries in Boost as of 1.52.0

क्या TR1 में था के अधिकांश मानकीकृत किया गया है और सी ++ 11 std नाम स्थान में है, और सी ++ 11 और पुस्तकालयों TR1 में उल्लेख किया है की तुलना में है कि बूस्ट निर्माणों से रूपांतरित किया गया, सूत्रण समर्थन की तरह होता है <thread> में परिभाषित किया गया।

जो कुछ आप उपयोग कर सकते हैं उसे परिभाषित करता है और आप किस नामस्थान का उपयोग कर सकते हैं अब आपके कंपाइलर पर निर्भर करता है। मुझे याद नहीं है, लेकिन मुझे लगता है कि हाल ही में जीसीसी-जी ++ कार्यान्वयन ने नए सी ++ 11 पुस्तकालयों के लिए std नामस्थानों का उपयोग करना शुरू कर दिया है, लेकिन इसे सक्रिय करने के लिए एक अलग कंपाइलर ध्वज की आवश्यकता हो सकती है। हालांकि वे अभी भी std::tr1 नामस्थान का समर्थन करेंगे। विज़ुअल सी ++ 2010 ने std::tr1 में पहले std नेमस्पेस में जो स्थानांतरित किया था, लेकिन विज़ुअल सी ++ 2008 ने अभी भी std::tr1 का उपयोग किया था।

+1

@VJo, हाँ, लेकिन आइए नाटक न करें कि यह सी ++ 1x नहीं होगा: पी – birryree

+4

यह मुझे हंसी बनाने के लिए सी ++ 0 सी – ybungalobill

+1

@ybungalobill +1 होने जा रहा है। :) – birryree

2

इसे एक बड़ा अंतर नहीं करना चाहिए क्योंकि अगले सी ++ मानक के बड़े हिस्सों को वास्तव में बूस्ट से विरासत में मिला था। तो यदि आपके पास std::bind है और अन्य कंपाइलरों के साथ संगत होने की आवश्यकता नहीं है, तो बस इसका उपयोग करें।boost::bind अच्छा है यदि आप कंपाइलर-स्वतंत्र होना चाहते हैं। मुझे लगता है कि std::tr1::bind के पास अन्य दो पर कोई लाभ नहीं है यदि वे उपलब्ध हैं: यह सी ++ 03 और सी ++ 0x दोनों के संबंध में गैर मानक है।

+1

परिभाषाओं को बढ़ावा से विरासत में मिला था लेकिन कोड कार्यान्वयन नहीं है और मुझे 200 9 में ट्रां :: :: बाइंड में भयानक बग मिलीं, जहां उसने आपको रेफरी() को ठीक से पारित करने की अनुमति भी नहीं दी। मेरी भावना यह है कि वे सिर्फ एसटीएल कार्यान्वयन में बूस्ट कोड की प्रतिलिपि नहीं बना सकते हैं और यह कम होने की संभावना है क्योंकि बूस्ट कोड की समीक्षा लंबी अवधि में पीयर-समीक्षा और परीक्षण की गई है, और इसलिए मैं व्यक्तिगत रूप से पसंद से बाहर हूं। – CashCow

+0

@CashCow: आपकी सलाह के लिए धन्यवाद। लेकिन वीसी ++ से पुस्तकालयों std :: के बारे में कैसे? क्या वे बूस्ट पुस्तकालयों से भी बदतर हैं? उदाहरण के लिए boost :: regex बनाम std :: regex? – Chan

9

आप बाँध (या बात के लिए किसी अन्य) का उपयोग करना चाहते हैं, तो एक अच्छा सुविधा, नाम स्थान नाम है यहाँ एक उदाहरण है: अगर आप MyNamespace बदल होने की

namespace MyNamespace = boost; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

, अब:

namespace MyNamespace = std::tr1; 

निम्नलिखित std::tr1::bind का उपयोग करता है।

namespace MyNamespace = std::tr1; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

आप, ज़ाहिर है, तत्व है कि आप आसानी से इसे भविष्य में नाम स्थान है, यदि आप जानते हैं कि आप std :: tr1 आप इसे सीधे और कभी नहीं एक उपनाम का उपयोग करना चाहिए चाहते बदलना चाहते हैं के लिए MyNamespace उपयोग करना चाहिए।

+0

बहुत ही अच्छी चाल के लिए धन्यवाद! – Chan

5

आपको अपने प्रश्न में काफी कुछ मिला है। मैं बस अपना उदाहरण कॉपी/पेस्ट कर सकता हूं और अपने प्रश्न का सही जवाब दे सकता हूं। विस्तार की आवश्यकता के रूप में केवल दो चीजें वास्तव में खड़ी हैं:

1) वास्तव में कैसे और क्यों std :: tr1 द्वारा विस्तारित किया जाता है। टीआर 1 "तकनीकी रिपोर्ट 1" है और यह अपने उपसमूहों में से एक द्वारा मानक समिति को प्रस्तावित लाइब्रेरी विस्तार का पहला आधिकारिक सेट है। तो यह मानक के विस्तार से थोड़ा अधिक है।

2) बूस्ट :: बाइंड वास्तव में कुछ सिस्टमों पर, std :: bind से अलग व्यवहार करता है। मुझे नहीं पता कि यह मानक पर है या नहीं, लेकिन एमएसवीसी लैम्ब्डा अभिव्यक्तियों में और std :: bind एक-दूसरे के साथ बहुत खराब व्यवहार करते हैं। शायद कुछ अन्य तरीकों से भी, मुझे याद नहीं है क्योंकि मैंने std :: bind की बजाय boost :: bind का उपयोग करने की नीति बनाई है। रिटर्न वैल्यू टेम्पलेट पैरामीटर को अक्सर msvc पर std :: bind से अनदेखा किया जाता है ताकि आपको (या जो भी हो) के बारे में त्रुटियां मिलें, जब आपने इसे std::bind<type>(...) के साथ निर्दिष्ट किया हो। बढ़ावा देने के बाद से व्यवहार में सटीक अंतर को समझने के लिए कभी भी परेशान नहीं किया गया :: बाइंड पहले से ही इसे हमारी नियमित शब्दावली में बना चुका था और हम जानते थे कि इसका उपयोग कैसे किया जाए।

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