अच्छी तरह से कॉलबैक
साथ std::function
(पहले boost::function
) समस्या खत्म हो इंटरफेस परिभाषित पसंद करते हैं समय की सबसे आप एक वर्ग विधि के लिए एक कॉलबैक करने की जरूरत है, और इसलिए समारोह वस्तु को this
बाध्य करने के लिए की जरूरत है। हालांकि कॉलिंग कोड में, आपके पास यह जानने का कोई तरीका नहीं है कि this
अभी भी आसपास है या नहीं। वास्तव में, आपको कोई जानकारी नहीं है कि this
भी है क्योंकि बाइंडर ने कॉलर की आवश्यकता के अनुसार कॉलिंग फ़ंक्शन के हस्ताक्षर को ढाला है।
यह स्वाभाविक रूप से अजीब दुर्घटनाओं का कारण बन सकता है क्योंकि कॉलबैक उन वर्गों के लिए विधियों में आग लगाने का प्रयास करता है जो अब मौजूद नहीं हैं।
आप निश्चित रूप से shared_from_this
का उपयोग कर सकते हैं और एक कॉलबैक में shared_ptr को बांध सकते हैं, लेकिन फिर आपका उदाहरण कभी नहीं जा सकता है। जिस व्यक्ति के पास आपको कॉलबैक है, उसके बिना अब भी आपके स्वामित्व में भाग लेता है। आप शायद अधिक अनुमानित स्वामित्व और विनाश चाहते हैं।
एक और समस्या, भले ही आप कॉलबैक को ठीक काम करने के लिए प्राप्त कर सकें, कॉलबैक के साथ, कोड भी decoupled हो सकता है। ऑब्जेक्ट्स के बीच संबंध यह पता लगाना मुश्किल हो सकता है कि कोड पठनीयता कम हो जाती है। इंटरफ़ेस, हालांकि, स्पष्ट रूप से निर्दिष्ट रिश्ते के साथ decoupling के उचित स्तर के बीच एक अच्छा समझौता प्रदान करते हैं जैसा कि इंटरफ़ेस का अनुबंध परिभाषित किया गया है। आप इस संबंध में और अधिक स्पष्ट रूप से निर्दिष्ट कर सकते हैं, जिनके मालिक हैं, जिनके मालिक हैं, विनाश आदेश आदि।
std::function
के साथ एक अतिरिक्त समस्या यह है कि कई डिबगर्स उन्हें अच्छी तरह से समर्थन नहीं करते हैं। वीएस 2008 और बूस्ट फ़ंक्शंस में, आपको अपने फ़ंक्शन पर जाने के लिए लगभग 7 परतों को चरणबद्ध करना होगा। यहां तक कि अगर अन्य सभी चीजें कॉलबैक के बराबर होती हैं तो सबसे अच्छी पसंद थी, std::function
के लक्ष्य पर गलती से कदम उठाने की तीव्र परेशानी और समय बर्बाद हो गया था, इससे बचने के लिए पर्याप्त कारण है। विरासत भाषा की मुख्य विशेषता है, और एक इंटरफ़ेस की ओवरराइड विधि में कदम उठाना तात्कालिक है।
अंत में मैं केवल जोड़ूंगा, हमारे पास सी ++ में प्रतिनिधि नहीं हैं। सी # में प्रतिनिधि भाषा का मुख्य हिस्सा हैं, जैसे विरासत सी ++ और सी # में है। हमारे पास एक एसडीडी लाइब्रेरी सुविधा है जो आईएमओ कोर भाषा कार्यक्षमता से एक परत हटा दी गई है। तो यह भाषा की अन्य मूल विशेषताओं के साथ कड़ाई से एकीकृत नहीं होने वाला है। यह फ़ंक्शन ऑब्जेक्ट्स के विचार को औपचारिक रूप से करने में मदद करता है जो अब एक अच्छा समय के लिए सी ++ मुहावरे हैं।
स्रोत
2012-03-07 17:43:58
'std :: function' फ़ंक्शन-पॉइंटर्स से अलग कैसे है (* इस संदर्भ में * कौन सा)? मुझे कोई मतभेद नज़र नहीं आ रहा है। यदि ऐसा है, तो सी ++ 11 के साथ क्या करना है? आप प्री-सी ++ 11 में रनटाइम पॉलीमोर्फिज्म को लागू करने के लिए फ़ंक्शन-पॉइंटर्स का भी उपयोग कर सकते हैं। – Nawaz
मुझे यह भी सुनिश्चित नहीं है कि उत्तर कैसे देना शुरू करें ... उदाहरण के लिए std :: फ़ंक्शन में विभिन्न प्रकार और तर्कों की संख्या के साथ फ़ंक्शंस में पॉइंटर हो सकता है क्योंकि आप वास्तव में इसे पार करने से पहले std :: bind कर सकते हैं। और, जाहिर है, यह उपयोग करने के लिए आसान तरीका है। यदि कुछ भी आप पूछ सकते हैं कि यह क्या कर सकता है _functors_ क्या नहीं कर सकता ... यह प्रश्न मैं समझूंगा। फिर भी, प्रतिनिधियों को बनाने के लिए मानक और * सरल * तरीके के अलावा, मेरे प्रश्न को वैसे भी उत्पन्न हुआ है। – Zeks
"* फिर भी, प्रतिनिधियों को बनाने के लिए मानक और सरल तरीके के अलावा, मेरे प्रश्न को वैसे भी उत्पन्न किया गया है। *" ... लेकिन यह सार आधार और वर्चुअल फ़ंक्शंस का उपयोग करने से * सरल नहीं है, तो बिंदु क्या है? – Nawaz