में std :: फ़ंक्शन हस्ताक्षर पर अधिभार कैसे करें मुझे पता है कि इस प्रश्न से पहले पूछा गया है, लेकिन काफी अनुभवी कोडर होने के बावजूद मुझे जवाब नहीं समझते हैं और इन प्रश्नों के उत्तर देने के लिए कोई तरीका नहीं दिखने के लिए स्पष्टीकरण। कोई "उत्तर" लिंक या कुछ भी नहीं है। इसके अलावा, वे सवाल काफी पुराने थे। तो, मैं सवाल फिर से पूछ रहा हूँ।सी ++
मेरे पास एक कक्षा है, जिसमें मैं + = ऑपरेटर को अधिभारित कर रहा हूं। मैं एक अधिभार एक नंगे समारोह सूचक लेना चाहते हैं, और अन्य एक std :: समारोह लेने के लिए:
void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
उपयोग:
MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
दुर्भाग्य से, कोड संकलन नहीं है क्योंकि संकलक निर्धारित नहीं कर सकता कि दूसरा अधिभार पहले + = कॉल के लिए अनुपयुक्त है।
मैं इस समस्या को ठीक करने के लिए अपने ऑपरेटर + = सदस्य फ़ंक्शंस को कैसे परिभाषित करूं? मैं नहीं बदलना चाहता कि ऑपरेटरों का उपयोग कैसे किया जाता है (उदाहरण के लिए एक स्पष्ट कलाकार का उपयोग करके)। मैं उन्हें उपरोक्त प्रदर्शन के रूप में काम करना चाहता हूं।
इसके अलावा, यह निम्नलिखित अधिभार के रूप में अच्छी तरह से पाना उपयोगी होगा:
void operator+=(function<void()> handler);
लेकिन फिर से, मैं समारोह <> टेम्पलेट के हस्ताक्षर के आधार पर अधिभार नहीं कर सकते।
अतिरिक्त उदाहरणों के लिए इस सूत्र देखें: Isn't the template argument (the signature) of std::function part of its type? (मुझे लगता है कि थ्रेड में उल्लिखित विभिन्न समाधान को लागू करने की कोशिश की, और उनमें से कोई भी संकलन होगा)
मैं की संख्या में कई वर्षों के लिए प्रोग्रामिंग किया गया है भाषाएं, लेकिन मेरे सी ++ कौशल थोड़ा जंगली हैं।
** बड़ा ** प्रश्न यह है: __ आप अपने ओवरलोड 'ऑपरेटर + = '? __ – zaufi
@zaufi में w/दिए गए फ़ंक्शन पॉइंटर या' std :: function' ऑब्जेक्ट को करने के लिए क्या कर रहे हैं: मैं यह देखने में असफल रहा यह प्रासंगिक है, लेकिन ठीक है। मैं इसे ईवेंट हैंडलर फ़ंक्शंस के std :: वेक्टर में जोड़ने जा रहा हूं। मैं अनिवार्य रूप से सी ++ में .NET घटनाओं को कार्यान्वित कर रहा हूं। क्योंकि शक्तियों ने अभी भी अपने सिर को इस तथ्य के चारों ओर लपेटा नहीं है कि घटनाएं और गुण हैं - क्लोजर की तरह - एक आधुनिक प्रोग्रामिंग भाषा के लिए बिल्कुल आवश्यक कार्यक्षमता। –
तो, तो आपको 'std :: vector 'के साथ तत्काल एक' std :: function' के साथ तत्काल होना चाहिए (मैं' void() 'हस्ताक्षर का सुझाव देता हूं ... क्या मैं सही हूँ? – zaufi