2012-07-27 24 views
25

std :: mem_fun और std :: mem_fn के बीच क्या अंतर है? नामकरण इतना उलझन में क्यों है?std :: एसटीडी बनाम mem_fun :: mem_fn

बूस्ट का documentation कहता है कि std :: mem_fn ज्यादातर मामलों में std :: mem_fun को प्रतिस्थापित कर सकता है। तो आप अभी भी किस स्थिति में std :: mem_fun का उपयोग करेंगे?

उत्तर

40

std::mem_fun बहिष्कृत किया गया है। std::mem_fn यह सब कुछ कर सकता है, और यह अधिक आसानी से करता है। दोनों के बीच संबंध std::bind1st/std::bind2nd और सी ++ 11 std::bind के बीच संबंध के समान है। std::mem_fn और std::bind दोनों को विकसित किया गया था और std::bind1st और std::mem_fun के बाद सी ++ 98 मानक में बनाया गया था। तो इसका मतलब है कि हमें सी ++ 11 तक पुरानी चीजों को बेहतर विकल्प के साथ ठीक से बदलने के लिए इंतजार करना पड़ा।

उदाहरण के लिए, std::mem_fun केवल उन सदस्यों के कार्यों से निपट सकता है जो एक या कोई तर्क नहीं लेते हैं। std::mem_fn विविध है और उन सदस्यों से निपट सकता है जो किसी भी संख्या में तर्क लेते हैं।

आपको क्लास ऑब्जेक्ट (क्रमशः) के लिए पॉइंटर्स या संदर्भों के साथ सौदा करना चाहते हैं या नहीं, इसके आधार पर आपको std::mem_fun और std::mem_fun_ref के बीच भी चयन करने की आवश्यकता है। std::mem_fn अकेले ही किसी के साथ सौदा कर सकता है, और स्मार्ट पॉइंटर्स के लिए भी समर्थन प्रदान करता है।

boost::mem_fn के प्रलेखन बस है कि जब आप कोड है कि std::mem_fun उम्मीद के साथ काम करने की आवश्यकता है जब std::mem_fun उपयोग करने के लिए, और डाल बताते हैं, या कि अनुकूलनीय functors उम्मीद (जो एक अप्रचलित धारणा है * सी ++ 03 से)। उन मामलों के लिए आप std::mem_fn में प्लग करने में सक्षम नहीं होंगे, इसलिए आपके पास यह है: आप विरासत के लिए std::mem_fun का उपयोग करेंगे।

*: मेरा मतलब है कि नया कोड C++ 03 प्रोटोकॉल पर निर्भर नहीं होना चाहिए उदा। result_type सदस्य प्रकार (std::result_of जैसे नए लक्षणों का उपयोग करने के लिए यह अधिक परंपरागत है) - std::bind/std::mem_fn जैसी नई सुविधाएं वास्तव में उन सदस्यों को प्रदान करती हैं यदि वे समकक्ष सी ++ 03 कोड में मौजूद होंगी। मैं यह समझने के लिए आपको छोड़ देता हूं कि आपको पुराने कोड को अपडेट करना चाहिए या नहीं, जो इस व्यवहार पर निर्भर करते हुए std::mem_fn के साथ अनुकूलनीय फ़ैक्टर पर निर्भर करता है।

+2

'std :: not1' और' std :: not2' अभी भी उन "अनुकूलनीय" टाइपपीफ की अपेक्षा करते हैं। – Cubbi

+0

@ कब्बी: क्या वे सी ++ 11 का एकमात्र भाग हैं जो अभी भी करते हैं? – Scotty

+1

@ स्कोटी जहां तक ​​मैंने देखा है, हां, केवल गैर-बहिष्कृत भागों। और 'std :: function' और' std :: mem_fn' से 'std :: ref' और' std :: map :: value_comp' तक उन टाइपपीफ के साथ मज़दूर बनाने के कुछ 25 तरीके हैं। – Cubbi

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