यदि फ़ंक्शन static
नहीं है, तो आप इसे किसी फ़ंक्शन में इनपुट में पास नहीं कर सकते जो गैर-सदस्य फ़ंक्शन पॉइंटर स्वीकार करता है।
मान लें कि गैर-static
सदस्य फ़ंक्शन के पास पहले पैरामीटर के रूप में ClassName
पर एक निहित सूचक है, जो उस ऑब्जेक्ट को इंगित करता है जिस पर सदस्य फ़ंक्शन का आह्वान किया जा रहा है।
struct X
{
static void foo() { } // Does not have an implicit "this" pointer argument
void bar() { } // Has an implicit "this" pointer argument
};
int main()
{
void (*f)() = &X::foo; // OK: foo is static
void (*g)() = &X::bar; // ERROR! bar is non-static
}
यहाँ, यहाँ तक कि std::bind()
नहीं काम करेंगे, क्योंकि परिणाम एक समारोह सूचक के लिए परिवर्तनीय नहीं है। लैम्ब्डा फ़ंक्शन पॉइंटर्स में परिवर्तनीय होते हैं, लेकिन केवल तभी जब वे गैर-कैप्चरिंग होते हैं (और यहां एक लैम्ब्डा को सदस्य फ़ंक्शन को आमंत्रित करने के लिए ऑब्जेक्ट को कैप्चर करने की आवश्यकता होगी)।
इसलिए, एकमात्र (बदसूरत) कामकाज वैश्विक एडाप्टर फ़ंक्शन होना है जो किसी वैश्विक ऑब्जेक्ट चर के माध्यम से उपलब्ध ऑब्जेक्ट पर सदस्य फ़ंक्शन को आमंत्रित करता है।
struct X
{
void bar() { }
};
void function_taking_a_function_pointer(void (*f)())
{
// Do something...
f();
}
X* pX = nullptr;
void bar_adapter()
{
pX->bar();
}
int main()
{
X x; // Some object I want to invoke the member function bar() on...
pX = &x; // Set the global pointer and invoke the function...
function_taking_a_function_pointer(bar_adapter);
}
आप चाहते हैं, तो आप एक समारोह में bar_adapter
मोड़ टेम्पलेट, और सूचक-टू-सदस्य-समारोह को पारित करके इस थोड़ा अधिक लचीला बनाने कर सकते हैं: वैश्विक सूचक चर पहले फ़ंक्शन को कॉल करने के लिए सेट कर दिया जाता एक टेम्पलेट तर्क के रूप में:
template<typename T, void (T::*mf)()>
void adapter()
{
(pX->*mf)();
}
यहाँ कैसे आप इसका इस्तेमाल होता है: अंत में
#include <iostream>
struct X
{
void foo() { std::cout << "X::foo()" << std::endl; }
void bar() { std::cout << "X::bar()" << std::endl; }
};
void function_taking_a_function_pointer(void (*f)())
{
// Do something...
f();
}
X* pX = nullptr;
template<typename T, void (T::*mf)()>
void adapter()
{
(pX->*mf)();
}
int main()
{
X x; // Some object I want to invoke the member function bar() on...
pX = &x; // Set the global pointer and invoke the function(s)...
function_taking_a_function_pointer(adapter<X, &X::foo>);
function_taking_a_function_pointer(adapter<X, &X::bar>);
}
, उसे ई live example है।
यदि आपको कोई त्रुटि हो रही है। यह क्या त्रुटि है? – 0x499602D2
मैं विजुअल स्टूडियो 2012 कंपाइलर का उपयोग कर रहा हूं। मैं अपने प्रश्न में संकलक त्रुटि डाल दूंगा। –
क्षमा करें, पहले गलत गलती त्रुटि, अब यह सही है –