दिलचस्प पोस्ट
तीर कार्यों और यह IE8 / 9 में jQuery और XDomainRequest के साथ कॉर्स क्या करता है | = (एकल पाइप बराबर) और & = (एक समानांतर और समान) मतलब है मैं LIMIT खंड में एक बड़ी ऑफसेट के साथ एक MySQL क्वेरी को कैसे बढ़ा सकता हूं? मैं JSON ऑब्जेक्ट के साथ एक TypeScript ऑब्जेक्ट को कैसे प्रारंभ करूं? जावास्क्रिप्ट में वैश्विक वस्तु कैसे प्राप्त करें? PHP में फाइल अपलोड प्रकार फ़ाइल आकार को कैसे सीमित करें? क्यों {} + {} केवल एनएएन ग्राहक पक्ष पर है? क्यों नोड। जेएस में नहीं? वेबमेल के लिए टाइमआउट सेट करें। डाउनलोडफ़ाइल () मैं केवल कैसे संरक्षित या निजी कंस्ट्रक्टर के साथ एक क्लास पर :: std :: make_shared कॉल करूं? अजगर के eval () बनाम ast.literal_eval () का उपयोग करना? मैं अपना स्विंग वर्कर उदाहरण कैसे ठीक से काम कर सकता हूं? गतिशील रूप से एक ExpandoObject में गुण जोड़ना माइक्रोसॉफ्ट एक्सेल में डार्कट्रिक्स को सीसीवी फाइलों में जोड़ता है? सी / सी + + मैक्रो में कॉमा

Std :: सदस्य फ़ंक्शन के साथ बाइंडिंग का उपयोग करना, ऑब्जेक्ट पॉइंटर का उपयोग करें या इस तर्क के लिए नहीं?

सदस्य कार्य को std::bind करने के लिए std::bind का उपयोग करते समय, पहला तर्क this सूचक होता है हालांकि यह ऑब्जेक्ट दोनों को एक पॉइंटर के रूप में पारित करने में काम करता है और नहीं।

उदाहरण के लिए निम्न प्रोग्राम देखें:

 #include <iostream> #include <functional> struct foo { void bar(int v) { std::cout << "foo::bar - " << v << '\n'; } }; int main() { foo my_foo; auto f1 = std::bind(&foo::bar, my_foo, 1); auto f2 = std::bind(&foo::bar, &my_foo, 2); f1(); f2(); } 

क्लैंग और जीसीसी दोनों शिकायत के बिना यह संकलित करते हैं, और नतीजे दोनों बांधों के लिए काम करता है:

 foo :: बार - 1
 foo :: बार - 2

मैं विनिर्देशन (अनुभाग 20.8.9) के आसपास मेरे सिर को लपेटने की कोशिश कर रहा था, लेकिन यह उन स्थानों में से एक है जहां यह मेरे पास स्पष्ट है

केवल एक ही सही होना चाहिए, या दोनों सही हैं?

वेब के समाधान से एकत्रित समाधान "Std :: सदस्य फ़ंक्शन के साथ बाइंडिंग का उपयोग करना, ऑब्जेक्ट पॉइंटर का उपयोग करें या इस तर्क के लिए नहीं?"

दोनों सही हैं। 20.8.9.1.2 आगे से 20.8.2 के लिए आवश्यकताओं को बताने के लिए और आपके कॉल को bind का प्रभाव। 20.8.2 है:

20.8.2 आवश्यकताएं [func.require]

1 इनवोकी (f, t1, t2, ..., tN) 1 (f, t1, t2, ..., tN) को निम्नानुसार परिभाषित करें:

(t1.*f)(t2, ..., tN) जब f क्लास T और T सदस्य फ़ंक्शन का सूचक होता है तो T प्रकार का ऑब्जेक्ट या T ऑब्जेक्ट या किसी संदर्भ के संदर्भ T से व्युत्पन्न एक प्रकार का एक वस्तु;

((*t1).*f)(t2, ..., tN) जब f क्लास T और T सदस्य फ़ंक्शन का सूचक है, तो पिछले आइटम में वर्णित प्रकारों में से एक नहीं है;

t1.*f N == 1 t1.*f जब N == 1 और f एक वर्ग T और t1 N == 1 सदस्य डेटा का एक सूचक है प्रकार T का एक ऑब्जेक्ट या प्रकार T ऑब्जेक्ट या किसी प्रकार के ऑब्जेक्ट के संदर्भ के संदर्भ T ;

(*t1).*f जब N == 1 और f क्लास T और t1 N == 1 सदस्य डेटा का सूचक है, पिछले आइटम में वर्णित प्रकारों में से एक नहीं है;

अन्य सभी मामलों में – f(t1, t2, ..., tN)

पहले दो विकल्प संदर्भ और एक सूचक दोनों को अनुमति देते हैं।

यहां ध्यान देने योग्य बात यह है कि शब्दों को आप साधारण पॉइंटर्स तक सीमित नहीं करते हैं। आप अपने उदाहरण को जिंदा रखने के लिए std::shared_ptr या कुछ अन्य स्मार्ट पॉइंटर का इस्तेमाल कर सकते हैं और यह अभी भी std::bind साथ काम करेगा क्योंकि t1 dereferenced है, चाहे वैसे भी (यह निश्चित है कि यह संभव है) ।

सही उत्तर जोड़ने के लिए (दोनों रूपों की अनुमति है)

मैं फ़ंक्शन तर्क घोषणा के साथ सादृश्य में दो बाध्यकारी विकल्पों के बारे में सोचता हूं, जो "मान से पारित" या "संदर्भ से पारित" हो सकता है।

f1 (उर्फ "मूल्य से" my_foo गुजरने के मामले में) परिणाम बाध्यकारी बिंदु से पिछले my_foo किए गए परिवर्तनों को "देख" नहीं करता है यह विशेष रूप से वांछित नहीं हो सकता है अगर my_foo विकसित हो "मूल्य के अनुसार" बाइंडिंग में प्रतिलिपि कन्स्ट्रक्टर के लिए (कई) कॉल की एक अतिरिक्त लागत है

इसमे अंतर है। जैसा कि rytis आगे रखा है, मूल्य से गुजारें my_foo में किए गए परिवर्तन नहीं देखता है। उदाहरण के लिए, यदि my_foo एक वर्ग है, मान से गुजर रहा है तो my_foo के सदस्य डेटा में कोई परिवर्तन नहीं दिखाई देता है