2010-07-02 25 views
7

मैं सी ++ में एक सदस्य समारोह सूचक, कि एक ही सदस्य समारोह सूचक प्रकारसदस्य समारोह सूचक कौन सा सदस्य समारोह सूचक के एक ही प्रकार

रिटर्न की घोषणा करना चाहते हैं देता है यह काम नहीं करता:

class MyClass { 
public: 
     typedef FunctionPtr (MyClass::*FunctionPtr)(); 
} 

क्या कोई समाधान ढूंढता है?

+0

मैं कहना उपयोग 'mem_fun_ref' अच्छा लगेगा, लेकिन मैं कैसे नहीं देख सकता। अच्छा प्रश्न। – wheaties

+1

फिर से नहीं ... हर कोई ऐसा क्यों करना चाहता है? मुझे इसके करीब भी कुछ भी चाहिए नहीं है। –

+0

@ डेविड: मैं उस पर तुम्हारे साथ हूं। मुझे सी ++ में प्रोग्रामिंग के 15 वर्षों में सदस्य पॉइंटर्स _once_ का उपयोग करना याद है। – sbi

उत्तर

5

बिल्कुल हासिल करने का कोई तरीका नहीं है। असल में, सदस्य फ़ंक्शंस यहां कोई फर्क नहीं पड़ता: एक साधारण फ़ंक्शन घोषित करने का कोई तरीका नहीं है जो पॉइंटर को अपने फ़ंक्शन प्रकार पर लौटाता है। घोषणा असीम रूप से रिकर्सिव होगी।

सामान्य कार्य के मामले में आप void (*)() प्रकार को "सार्वभौमिक" फ़ंक्शन पॉइंटर प्रकार के रूप में उपयोग कर सकते हैं (जैसे void * अक्सर डेटा प्रकारों के लिए उपयोग किया जाता है)। सदस्य फ़ंक्शन पॉइंटर्स के लिए जो void (A::*)() प्रकार होगा। यद्यपि आपको उस उद्देश्य के लिए reinterpret_cast का उपयोग करना होगा। हालांकि, यह उपयोग (एक राउंड-ट्रिप रूपांतरण) तब होता है जब reinterpret_cast का व्यवहार परिभाषित किया जाता है।

बेशक, आपको पॉइंटर को उस प्रकार से बदलने के लिए कास्ट का उपयोग करने के लिए मजबूर होना होगा। AFAIK, एक इंटरमीडिएट अस्थायी टेम्पलेट ऑब्जेक्ट के साथ सुरुचिपूर्ण टेम्पलेट-आधारित समाधान हैं जो कास्टिंग करते हैं।

आप इस GotW entry पर भी एक नज़र डालना चाहते हैं।

पीएस नोट, कि void * फ़ंक्शन पॉइंटर्स के लिए मध्यवर्ती प्रकार के रूप में टाइप करना भाषा द्वारा प्रतिबंधित है। हालांकि इस तरह के अवैध उपयोग सामान्य फ़ंक्शन पॉइंटर्स के साथ "काम करने" लगते हैं, लेकिन सदस्य फ़ंक्शन पॉइंटर्स के साथ काम करने का बिल्कुल कोई मौका नहीं है। सदस्य फ़ंक्शन पॉइंटर्स आम तौर पर void * पॉइंटर के आकार से अधिक आकार वाले गैर-तुच्छ वस्तुओं होते हैं।

0

जो आप करने की कोशिश कर रहे हैं वह संभव नहीं है - फ़ंक्शन का रिटर्न प्रकार फ़ंक्शन का प्रकार है, जिसे अभी तक ज्ञात नहीं है, इसलिए यह एक अनंत चक्र की ओर जाता है।

5

AndreyT GotW #57 में सर्वश्रेष्ठ उत्तर का संदर्भ है, तो मैं रूप में अच्छी तरह इसे यहाँ दोहरा सकते हैं:

class MyClass { 
public: 
     struct FunctionPtrProxy; 
     typedef FunctionPtrProxy (MyClass::*FunctionPtr)(); 

     struct FunctionPtrProxy 
     { 
       FunctionPtrProxy(FunctionPtr pp) : p(pp) { } 
       operator FunctionPtr() { return p; } 
       FunctionPtr p; 
     } 

} 
+2

मजेदार कितने "यह संभव नहीं है" उत्तर गायब हो गए हैं ... – Beta

+0

मैं काम करने के लिए GoW # 57 पर उदाहरण प्राप्त करने में सक्षम था। लेकिन अगर मैं उपरोक्त वर्ग में एक सदस्य फ़ंक्शन जोड़ता हूं जो केवल खुद को लौटाता है जो संकलन करने में विफल रहता है (gcc त्रुटि: प्रकार 'MyClass :: FunctionPtrProxy (MyClass ::)()' का तर्क 'MyClass :: FunctionPtrProxy' से मेल नहीं खाता है)। @MSN क्या आप उपरोक्त वर्ग के साथ एक उदाहरण दे सकते हैं जहां आपके पास एक सदस्य फ़ंक्शन है जो स्वयं को लौटाता है और जहां यह संकलित होता है, धन्यवाद :) –

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