2015-08-24 7 views
11

मैंने देखा इस तरह के This case of template function overloading eludes my understandingगैर-टेम्पलेट किए गए कार्यों के लिए समान नाम और तर्क क्यों हैं लेकिन अलग-अलग रिटर्न प्रकारों के लिए अवैध क्यों है? (लेकिन टेम्पलेट कार्यों के लिए कानूनी?)

और

Function overloading by return type?

लेकिन के रूप में कुछ संबंधित ढेर अतिप्रवाह धागे न मुझे ठीक जवाब मैं तलाश कर रहा हूँ देने के लिए लगता है, कम से कम इस तरह से नहीं कि मेरे लिए व्याख्या करना आसान हो गया है।

मेरा प्रश्न यह करने पर निर्भर करता है: यह कानूनी ऐसा करने के लिए क्यों, दोनों एक डिजाइन और तकनीकी दृष्टिकोण से, यह है:

#include <iostream> 

using namespace std; 

template<class T> 
void func(){ 
    cout << "Compiler inferred from void return value!\n"; 
} 

template<class T> 
int func(){ 
    cout << "Compiler inferred from int return value!\n"; 
    return 0; 
} 

int main(){ 
    void (*thisFunc)()=func<int>; 
    int (*thatFunc)()=func<int>; 
    thisFunc(); 
    thatFunc(); 
} 

लेकिन यह नहीं:

#include <iostream> 

using namespace std; 

void func(){ 
    cout << "You won't see this because it won't compile!\n"; 
} 

int func(){ 
    cout << "Nor this one!\n"; 
    return 0; 
} 

int main(){ 
    void (*thisFunc)()=func; 
    int (*thatFunc)()=func; 
    thisFunc(); 
    thatFunc(); 
} 

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

संपादित करें: बात यह है कि मुझे परेशान सबसे विसंगति है: मैं बहुत लंबी और कठिन लगता होगा इससे पहले कि मैं वास्तव में वापसी प्रकार से अधिक भार माना जाता है, लेकिन अगर कोई है जो चाहता वापसी प्रकार से ओवरलोड के लिए "ठीक" बस एक अर्थहीन टेम्पलेट पैरामीटर जोड़ना है या स्पष्ट रूप से नामस्थानों के अंदर कार्यों को लपेटना है, तो मुझे लगता है कि या तो सी ++ या तो संदिग्ध विचारों के बारे में अधिक या कम सख्त होना चाहिए। क्या कोई अनिवार्य कारण है कि क्यों टेम्पलेट्स और नेमस्पेस को इस कार्यक्षमता को सही तरीके से काम करने की आवश्यकता है? क्या वांछनीय कोड का एक उदाहरण है जो काम नहीं कर सका, उदाहरण के लिए, मेरे उदाहरण में टेम्पलेट को कोड को असंबद्ध करने की अनुमति नहीं थी? मैं एक भाषा डिजाइन दृष्टिकोण से पूछ रहा हूं, एक संकलक अनुपालन दृष्टिकोण नहीं।

+0

टेम्पलेट के लिए, मुझे लगता है कि यह SFINAE या रिटर्न प्रकार की अनुमति देना है। – Jarod42

+3

आप रिटर्न प्रकार पर वास्तव में ओवरलोड नहीं कर रहे हैं, लेकिन SFINAE का उपयोग करके प्रत्येक फ़ंक्शन पॉइंटर के लिए केवल एक ही संभावित टेम्पलेट इंस्टेंटेशन का चयन करें। जब आप 'func ' का उपयोग करते हैं, प्रत्येक घोषणा में केवल एक ही टेम्पलेट होता है जहां प्रतिस्थापन काम करता है, लेकिन यह विफल होने के लिए कोई त्रुटि नहीं है। यह सिर्फ अनदेखा है। –

उत्तर

11

यह सामान्य रूप से अमान्य नहीं है: रिटर्न प्रकार पर गैर-टेम्पलेट फ़ंक्शंस को अधिभारित करने का एक तरीका है। यह वही तरीका है जिस तरह से आप इसे कर रहे हैं।

namespace A { 
    void func() {} 
} 
namespace B { 
    int func() { return 0; } 
} 
using A::func; 
using B::func; 
int main(){ 
    void (*thisFunc)()=func; 
    int (*thatFunc)()=func; 
    thisFunc(); 
    thatFunc(); 
} 

यह संकलित, लिंक और ठीक चलाता है।

चूंकि यह मान्य है और वास्तविक कार्यान्वयन द्वारा स्वीकार किया जाता है, यह स्पष्ट होना चाहिए कि कोई तकनीकी कारण नहीं है कि आपका कोड मान्य क्यों नहीं हो सकता है। माना जाता है कि इसे नाम बदलने के लिए कुछ बदलावों की आवश्यकता होगी, क्योंकि आम तौर पर गैर-टेम्पलेट फ़ंक्शंस में उलटा नाम में उनका रिटर्न टाइप नहीं होता है, लेकिन यह आसानी से करने योग्य होता है।

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

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