boost::function
operator()
सही हस्ताक्षर के साथ कुछ भी करने की अनुमति देता है पैरामीटर के रूप में बाध्य किया जा सकता है, और आपके बाइंड के परिणाम को एक पैरामीटर के साथ कहा जा सकता है int
, इसलिए इसे बाध्य किया जा सकता है function<void(int)>
।
यह इस प्रकार काम करता है (यह विवरण समान रूप से लागू होता है std::function
):
boost::bind(&klass::member, instance, 0, _1)
इस तरह एक वस्तु देता है
struct unspecified_type
{
... some members ...
return_type operator()(int i) const { return instance->*&klass::member(0, i);
}
जहां return_type
और int
के हस्ताक्षर से घृणा होती है klass::member
, और फ़ंक्शन पॉइंटर और बाउंड पैरामीटर वास्तव में ऑब्जेक्ट में संग्रहीत होते हैं, लेकिन यह महत्वपूर्ण नहीं है
अब, boost::function
किसी भी प्रकार की जाँच नहीं करता है: यह आपके टेम्पलेट पैरामीटर में आपके द्वारा प्रदान की गई कोई भी वस्तु और कोई भी हस्ताक्षर लेगा, और एक ऐसी वस्तु बनाएँ जो आपके हस्ताक्षर के अनुसार कॉल करने योग्य हो और वस्तु को कॉल करे। यदि यह असंभव है, तो यह एक संकलन त्रुटि है।
boost::function
वास्तव में इस तरह एक वस्तु है:
template <class Sig>
class function
{
function_impl<Sig>* f;
public:
return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};
जहां return_type
और argument_type
से निकाले जाते हैं Sig
, और f
गतिशील रूप से ढेर पर आवंटित किया जाता है। यह अलग आकार के साथ पूरी तरह से असंबंधित वस्तुओं को अनुमति देने के लिए आवश्यक है boost::function
।
function_impl
सिर्फ एक अमूर्त वर्ग है
template <class Sig>
class function_impl
{
public:
virtual return_type operator()(argument_type arg0) const=0;
};
वह वर्ग जो सभी कार्य करता है, एक ठोस वर्ग है, जो व्युत्पन्न है boost::function
। आपके द्वारा निर्दिष्ट प्रत्येक प्रकार की वस्तु के लिए एक हैboost::function
template <class Sig, class Object>
class function_impl_concrete : public function_impl<Sig>
{
Object o
public:
virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); }
};
आपके मामले में इसका मतलब है, कार्य को बढ़ावा देने के लिए असाइनमेंट:
- एक प्रकार का तात्कालिकता
function_impl_concrete<void(int), unspecified_type>
(वह समय संकलन करता है, निश्चित रूप से)
- ढेर पर उस प्रकार की एक नई वस्तु बनाता है
- बूस्ट के सदस्य :: फ़ंक्शन को यह ऑब्जेक्ट असाइन करता है
जब आप फ़ंक्शन ऑब्जेक्ट को कॉल करते हैं, तो यह इसके कार्यान्वयन ऑब्जेक्ट के वर्चुअल फ़ंक्शन को कॉल करता है, जो कॉल को आपके मूल फ़ंक्शन पर निर्देशित करेगा।
अस्वीकरण: ध्यान दें कि इस विवरण में नाम जानबूझकर बनाए गए हैं। वास्तविक व्यक्तियों या पात्रों से कोई समानता ... आप इसे जानते हैं। उद्देश्य सिद्धांतों को स्पष्ट करना था।