2008-10-30 16 views
9

हम सी-जैसी भाषाओं को क्यों नहीं देखते हैं जो रिटर्न प्रकार में बहुरूपता के साथ कॉलबेल के लिए अनुमति देते हैं? मैं देख सकता था कि अतिरिक्त प्रकार की अनुमान बाधा कैसे होगी, लेकिन हमारे पास plenty of languages है जो पूर्ण प्रकार के प्रकार की अनुमान प्रणाली (जो "काम" के विभिन्न स्तरों के लिए काम करता है) के साथ है।सी-जैसी भाषाओं में रिटर्न टाइप पॉलीमोर्फिज्म

संपादित करें: रिटर्न प्रकार पॉलिमॉर्फिज्म का मतलब है कि केवल रिटर्न प्रकार में फ़ंक्शन हस्ताक्षर को अधिभारित करना है। उदाहरण के लिए, सी ++ और जावा केवल औपचारिक मानकों के प्रकार में ओवरलोडिंग की अनुमति देता है, न कि रिटर्न प्रकार में।

+0

टाइप अनुमान को सी ++ 0x में शामिल किया जाएगा, और आपके द्वारा सुझाए जा रहे रिटर्न प्रकार पॉलीमोर्फिज्म से अलग है। –

उत्तर

15

द्वारा "वापसी प्रकार बहुरूपता" आप वापसी मान प्रकार के आधार पर अधिक भार मतलब है, मैं अन्य भाषाओं के बारे में यकीन नहीं है, लेकिन सी के लिए ++ यहाँ जवाब (सुंदर घोड़े के मुंह से ज्यादा) है:

समारोह रिटर्न प्रकार केवल ओवरलोड रिज़ॉल्यूशन में नहीं आते हैं क्योंकि स्ट्रॉस्ट्रप (मैं अन्य सी ++ आर्किटेक्ट्स से इनपुट के साथ मानता हूं) अधिभार संकल्प 'संदर्भ स्वतंत्र' होना चाहता था। 7.4.1 देखें - "सी ++ प्रोग्रामिंग भाषा, तीसरा संस्करण" से "ओवरलोडिंग और रिटर्न टाइप"।

कारण के लिए संकल्प रखना है एक व्यक्ति ऑपरेटर या समारोह कॉल संदर्भ स्वतंत्र।

वे चाहते थे कि यह केवल ओवरलोड को कैसे बुलाया जाए - न कि परिणाम का उपयोग कैसे किया गया था (अगर यह बिल्कुल उपयोग किया गया था)। दरअसल, परिणाम का उपयोग किए बिना कई कार्यों को बुलाया जाता है या नतीजा बड़े अभिव्यक्ति के हिस्से के रूप में उपयोग किया जाएगा। एक कारक जिसे मैं निश्चित रूप से खेलता हूं जब उन्होंने फैसला किया कि यह था कि यदि रिटर्न का प्रकार संकल्प का हिस्सा था तो अधिभारित कार्यों के लिए कई कॉल होंगे जिन्हें जटिल नियमों के साथ हल करने की आवश्यकता होगी या संकलक फेंकना होगा एक त्रुटि है कि कॉल संदिग्ध था।

और, भगवान जानता है, सी ++ अधिभार संकल्प पर्याप्त जटिल के रूप में यह खड़ा है ...

+0

सच है, आपने जो भी फ़ंक्शन किया है, उसमें शून्य संदर्भ में अपरिभाषित व्यवहार होगा - जब तक कि ओवरलोडेड शून्य रिटर्न प्रकार न हो। – cdleary

3
double x = (double)foo(); 
ऊपर

अस्पष्ट है अगर वहाँ foo() कि डबल लौट सकते हैं, int, नाव, आदि के संस्करण हैं

+2

हाँ लेकिन स्ट्रिंग एस = foo(); डबल एक्स = foo(); int i = foo(); संदिग्ध नहीं हैं। अगर फू पहले से ही दोहरा चुका है तो मैं फिर से वापसी के प्रकार को दोबारा क्यों दूँगा? और यदि foo का कोई संस्करण डबल नहीं लौटाता है तो (पहले) कास्ट ओवरलोडेड रिटर्न प्रकार से मेल खाना चाहिए ... –

0

प्रकारों के स्वत: रूपांतरण की वजह से, यह जानना स्पष्ट नहीं है कि रिटर्न प्रकार बंद होने पर कौन सा फ़ंक्शन कॉल करना है।

4

मुझे इस सुविधा को कुछ भाषा में देखना अच्छा लगेगा, न केवल फ़ंक्शन foo डबल या एक int या स्ट्रिंग लौटा सकता है, लेकिन यह भी कि foo विभिन्न वर्गों की संरचना या ऑब्जेक्ट वापस कर सकता है। कॉल को असंबद्ध करना काफी मामूली होगा - यदि कॉल संदिग्ध है, तो वांछित वापसी प्रकार का चयन करने के लिए एक कलाकार की आवश्यकता होती है। उदाहरण:

string s = foo(); //foo returns a string 
double x = foo(); //foo returns a double 
int i = foo();  //foo returns an integer 
float f = (float)(int)foo(); //call the int foo and convert to float 
अलावा

Animal a = fooFactory(); //fooFactory returns an Animal 
Plant p = fooFactory();  //foofactory returns a Plant 

इन स्थितियों नहीं ऊपर बहुत बार

+0

उस मामले में हमें गैर-निर्दिष्ट कॉल पर प्रतिबंध लगा देना चाहिए या कम से कम कुछ (प्लांट) fooFactory() – shabunc

2

सी में आते हैं, लेकिन जब वे करते हैं वैकल्पिक हल अक्सर काफी बदसूरत है ... ++ आप ऐसा कर सकते हैं कक्षाओं के साथ बड़ी हद तक। उदाहरण के लिए, कहें कि मेरे पास एक डेटा प्रकार है जिसे नियमित रूप से इनपुट और आउटपुट पर ASCII में परिवर्तित किया जाता है;

typedef char* pchar; 

class MyType 
{ 
public: 

operator pchar() { return(ConvertToASCII()); } 
MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); } 

pchar ConvertToASCII(); 
void ConvertFromASCII(pchar ASCII); 
} 

इस प्रकार की चीज अक्सर सी ++ ढांचे में उपयोग की जाती है। उदाहरण के लिए, एमएफसी सीएसटींग कक्षा के प्रवर्तन पर एक नज़र डालें।आईएमएचओ, यह एक बहुत उपयोगी उपकरण है, हालांकि कुछ परिस्थितियों में खतरनाक है।

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

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