2013-04-23 26 views
5

मैं इस कोड है?std :: समारोह और std :: बाँध व्यवहार

यह कैसे void(int) functor का उपयोग करके void() समारोह कॉल करने के लिए संभव है?

+1

सिर्फ एक nitpick के रूप में: यह भी सभी आवश्यक '# include' अपने कोड नमूने (वेक्टर, iostreams, कार्यात्मक) में बयान प्रदान करें। कॉपी-पेस्ट करने के लिए इसे और अधिक सुविधाजनक बनाता है। – TemplateRex

उत्तर

9

function के लिए टेम्पलेट तर्क के रूप में पारित हस्ताक्षर केवल यह निर्धारित करता है कि कितने स्थान धारक (_1) बाध्य होंगे, और किस प्रकार के रूप में।

वास्तविक समारोह के आह्वान केवल वास्तव में बाध्य समारोह के लिए आवश्यक तर्क की संख्या का उपयोग करता है। असल में, अनावश्यक पैरामीटर को नजरअंदाज कर दिया जाता है। (?)

एक अन्य, अधिक शिक्षाप्रद उदाहरण के लिए, दूसरी तरफ से इस पर देख रहे हैं:

#include <iostream> 
#include <functional> 

void gun(int i) 
{ 
    std::cout<<"gun("<<i<<")"; 
} 

int main() 
{ 
    using namespace std::placeholders; 
    std::bind(gun, _5)("ignore", 3, "and", 4, 43); 
} 

प्रिंटों

gun(43) 
+0

मैं माफी चाहता हूँ, लेकिन यह मेरे सवाल का जवाब नहीं है: कैसे std :: बाँध x पैरामीटर समारोह एक्स + K पैरामीटर std :: समारोह कर सकते हैं? यह स्पष्ट है कि यह x + k पैराम फ़ंक्शन x पैराम्स std :: फ़ंक्शन से कैसे बना सकता है। – Felics

+0

@Felics पूरी तरह से कुंद होने के लिए, सख्त जवाब होगा: "कि कार्यान्वयन परिभाषित है" - मानक निर्दिष्ट नहीं करता है कैसे 'std :: function' लागू किया जाना है, या, उस बात के' एसटीडी की वापसी प्रकार के लिए: : bind'। तो यदि आप वास्तव में जानना चाहते थे ** कैसे ** इसे लागू किया गया है, तो अपने कार्यान्वयन पर जाएं। मैंने सोचा था कि आप इसके बारे में अवधारणा से पूछ रहे थे, और मुझे लगता है कि मैंने इसका जवाब दिया था। – sehe

+0

@Felics यह भी देखें [इस सवाल] (http://stackoverflow.com/questions/13251976/why-do-objects-returned-from-bind-ignore-extra-arguments) – TemplateRex

0

यह कैसे void(int) functor का उपयोग करके void() समारोह कॉल करने के लिए संभव है?

std::bind(fun) एक void() समारोह वापस नहीं करता है, यह अनिर्दिष्ट प्रकार का एक कॉल आवरण देता है।

कि कॉल आवरण शून्य तर्क के साथ किया जाएगा आह्वान करने के लिए हमेशा की तरह, लेकिन bind() के सबसे कार्यान्वयन में उस प्रकार शून्य या अधिक तर्क के साथ कहा जा सकता है और अतिरिक्त तर्क नजरअंदाज कर दिया जाएगा (लक्ष्य तक नहीं पहुंचेगी यानी समारोह)

आम तौर पर, एक समारोह FN तर्क लेने के लिए, bind(F) एक फोन आवरण कि N या अधिक तर्क के साथ कहा जा सकता है देता है। यदि आप तर्क देते हैं या प्लेसहोल्डर का उपयोग करते हैं तो यह कॉल रैपर को आमंत्रित करने के लिए आवश्यक न्यूनतम तर्कों को बदल देगा।

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