2012-04-11 19 views
8

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

int test(const std::string&) { 
    return 0; 
} 

int test(const std::string*) { 
    return 0; 
} 

int main() { 
    std::function<int(const std::string&)> func = test; 
    return func(); 
} 

उत्तर

17

यह संदिग्ध स्थिति है।

typedef int (*funtype)(const std::string&); 

std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast! 

अब संकलक स्थिति को स्पष्ट करने के लिए, इस फिल्म में प्रकार के आधार पर सक्षम हो जाएगा:

यह स्पष्ट करने के लिए, स्पष्ट कलाकारों के रूप में इस्तेमाल करते हैं।

या, आप यह कर सकते हैं:

typedef int (*funtype)(const std::string&); 

funtype fun = test; //no cast required now! 
std::function<int(const std::string&)> func = fun; //no cast! 

तो क्यों std::function<int(const std::string&)> रास्ता funtype fun = test ऊपर काम करता है काम नहीं करता है?

वैसे जवाब है, क्योंकि std::function किसी ऑब्जेक्ट के साथ शुरू किया जा सकता है, क्योंकि इसके कन्स्ट्रक्टर टेम्पलेटेटेड हैं जो टेम्पलेट तर्क से स्वतंत्र हैं जो आप std::function पर पारित हुए हैं।

+1

पुरानी स्टाइल कास्ट के स्थान पर 'static_cast' का उपयोग करें। – Anonymous

+0

@ अनाम: हाँ। लेकिन मैं इसे छोटा बनाना चाहता था। वैसे भी, मैंने इसे सी ++ - आईएसएच की तरह दिखने के लिए संपादित किया! – Nawaz

+0

कितना विडंबनापूर्ण है - आपको फ़ंक्शन पॉइंटर्स से दूर जाने के लिए पेश किए गए std :: फ़ंक्शन प्राप्त करने के लिए फ़ंक्शन पॉइंटर्स का उपयोग करना होगा :) thx – abergmeier

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