2010-09-20 9 views
5

फ़ंक्शन आमंत्रण के लिए मैं उम्मीदवार कार्यों (या व्यवहार्य कार्यों या सर्वोत्तम व्यवहार्य कार्यों) को कैसे डंप कर सकता हूं?फ़ंक्शन ओवरलोड रिज़ॉल्यूशन में उम्मीदवारों को कैसे डंप करें?

मुझे पता है कि g ++ option to dump class hierarchy प्रदान करता है। (वास्तव में, विजुअल स्टूडियो 2010 एक समान विकल्प प्रदान करता है, लेकिन यह अनियंत्रित है। मुझे इसके बारे में कुछ पढ़ना याद है-शायद वीसी ++ टीम ब्लॉग में- लेकिन मुझे इसे स्पष्ट रूप से याद नहीं किया जा सकता है।)

हाल ही में, मैं पढ़ रहा हूं सी ++ 0 एक्स ड्राफ्ट में ओवरलोड रिज़ॉल्यूशन के बारे में, और यह वास्तव में मुझे शर्मिंदा करता है।

क्या कोई संकलक उम्मीदवार कार्यों, व्यवहार्य कार्यों या सर्वोत्तम व्यवहार्य कार्यों को डंप करने का विकल्प प्रदान करता है?

नोट: ओवरलोड रिज़ॉल्यूशन परिदृश्य में उम्मीदवार कार्य संकलक त्रुटि में उम्मीदवार कार्यों से अलग है। ओवरलोड रिज़ॉल्यूशन परिदृश्य में उम्मीदवार/व्यवहार्य/सर्वोत्तम व्यवहार्य कार्य का अपना अर्थ है। मुझे पता है कि ओवरलोड रिज़ॉल्यूशन में उनके तीन चरण हैं: उम्मीदवारों के कार्यों को ढूंढें; व्यवहार्य कार्यों को ढूंढें; सर्वोत्तम व्यवहार्य कार्यों को ढूंढें। आम तौर पर, सबसे अच्छा व्यवहार्य कार्य केवल एक उम्मीदवार है; अन्यथा, कॉल संदिग्ध है। प्रत्येक चरण के अपने नियम हैं।

+2

आप उम्मीदवारों के कार्यों को क्यों जानना चाहते हैं जो व्यवहार्य नहीं हैं? "आप कौनसी समस्याएं हल करने की कोशिश कर रहे हैं?" –

+0

मैं सिर्फ उत्सुक हूं, और जानना चाहता हूं कि ओवरलोड रिज़ॉल्यूशन वास्तव में कैसे काम करता है। – Yuncy

उत्तर

1

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

+0

इस मामले में, कंपाइलर त्रुटि द्वारा छोड़े गए उपलब्ध उम्मीदवार सबसे अच्छे व्यवहार्य कार्य हैं। यह ओवरलोड रिज़ॉल्यूशन में उम्मीदवार कार्य या व्यावहारिक कार्य नहीं है। – Yuncy

2

मुझे नहीं लगता कि कोई प्रत्यक्ष तरीका है।

एक तरीका जानबूझकर एक संघर्ष/अस्पष्टता कृत्रिम रूप से बनाना है। अधिकांश कंपाइलर नीचे दिए गए फॉर्म की एक त्रुटि उत्सर्जित करते हैं, जो उम्मीदवारों की सूची को बाहर निकाल देते हैं।

namespace A { 
    void f(int x) {} 
} 
void f(int x) {} 
void f(char x) {} 

using namespace A; 

int main(){ 
    f(2.2); 
} 

जी ++ त्रुटि संदेश:

 
prog.cpp: In function ‘int main()’: 
prog.cpp:10: error: call of overloaded ‘f(double)’ is ambiguous 
prog.cpp:4: note: candidates are: void f(int) 
prog.cpp:5: note:     void f(char) 
prog.cpp:2: note:     void A::f(int) 
+0

आउटपुट उम्मीदवार फ़ंक्शन ओवरलोड रिज़ॉल्यूशन परिदृश्य में उम्मीदवार कार्य अवधि से अलग है .. – Yuncy

+2

आप ऐसा क्यों कहते हैं? एक उम्मीदवार वह होता है जिसका फ़ंक्शन के नाम के समान नाम होता है। एक और फ़ंक्शन 'int f (int x, char x) {} 'कोड में मैंने ऊपर दिखाया है और देखता है कि कैसे जीसीसी रिपोर्ट करता है कि एक उम्मीदवार के रूप में (भले ही यह बाद में निर्धारित नहीं है) – Chubsdad

2

एक तरह से सभी कार्यों कि विचार किया गया है डंप करने के लिए, पैरामीटर कुछ भी मेल नहीं खाएगा का एक सेट के साथ एक विशेष कार्य के नाम का उपयोग करने के लिए है:

struct DumpThemAll {}; 

int main(int argc, char* argv[]) 
{ 
    std::cout << DumpThemAll() << std::endl; 
} 

यह (सामान्यतः) सभी operator<< को डंप करेगा जो ओवरलोड रिज़ॉल्यूशन के लिए माना जाता था। इस विशेष उदाहरण के लिए, यह बालों वाली हो सकती है।

यदि आप केवल कुछ विशिष्ट कार्यों को डंप करना चाहते हैं, तो यह अधिक कठिन है। ऐसा करने का एकमात्र तरीका कृत्रिम रूप से एक संदिग्ध कॉल बनाना होगा, हालांकि एक कॉल केवल संदिग्ध है यदि आपके द्वारा प्रदान किए जाने वाले नकली कार्य में सर्वोत्तम मिलान की तुलना में सटीक "स्कोर" होता है ... इसलिए ऐसा एक कार्य तैयार करना कठिन होता है आप समझ नहीं पाते कि यह स्कोरिंग कैसे काम करती है (और व्यक्तिगत रूप से, मुझे यह सब समझ में नहीं आता है ... बहुत सारे नियम हैं ...)

हालांकि मैं इसे जोड़ दूंगा हालांकि शायद कुछ मुट्ठी भर उन लोगों का जो अपने सिर के ऊपर से ओवरलोड नियमों का हवाला देते हैं, या शायद इसे समझ भी सकते हैं, आम तौर पर यह आपको काम करने से नहीं रोकता है, क्योंकि मानक प्रत्येक संभावित मामले को संबोधित करने की कोशिश करता है जबकि आप केवल दो जोड़े के साथ काम करते हैं उनमें से।

इसके अलावा, फ़ंक्शन/ऑपरेटर ओवरलोड का दुरुपयोग आपके कार्यक्रम को मनुष्यों के लिए आर्केन के लिए अपठनीय बनाता है (विशेष रूप से वर्तमान अनुवाद इकाई में शामिल फ़ाइलों के विशेष के अधीन)।

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

  • कोई संबंधित समस्या नहीं^_^