कनवर्ट करना सबसे पहले, मैं दो वर्गों को परिभाषित करता हूं, जो एक-दूसरे से प्राप्त होते हैं।std :: function <void (व्युत्पन्न *)> को std :: function <void(Base*)>
class A {
};
class B : public A {
};
फिर, मैं एक समारोह के एक std::function<void(A*)>
का उपयोग करता है की घोषणा: अंत में
void useCallback(std::function<void(A*)> myCallback);
, मैं का एक std::function
प्राप्त एक अलग (लेकिन सैद्धांतिक रूप से संगत) कहीं और है कि मैं चाहते हैं से करने के लिए टाइप करें मेरे कॉलबैक फ़ंक्शन में उपयोग करें:
std::function<void(B*)> thisIsAGivenFunction;
useCallback(thisIsAGivenFunction);
मेरा कंपाइलर (क्लैंग ++) इस से इनकार करता है क्योंकिका प्रकारअपेक्षित प्रकार से मेल नहीं खाता है। लेकिन B
A
से विरासत में, यह thisIsAGivenFunction
के लिए स्वीकार्य होने के लिए समझ में आता है।
क्या यह होना चाहिए? यदि नहीं, क्यों? और अगर यह होना चाहिए, तो मैं क्या गलत कर रहा हूँ?
[सी ++ टेम्पलेट्स पॉलिमॉर्फिज्म] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2203388/c-templates-polymorphism) – Samuel
यह डुप्लिकेट नहीं है, 'std :: function' ऐसे * रूपांतरण * का समर्थन करता है। लेकिन दूसरी तरफ, आप 'std :: function' 'std :: function ' में कनवर्ट कर सकते हैं, क्योंकि 'ए *' पर चलने वाला फ़ंक्शन वही कर सकता है जब उसे 'बी *' का उदाहरण प्राप्त होता है, लेकिन दूसरी तरफ –
आपकी समस्या का स्रोत 'std :: function' का उपयोग टेम्पलेट तर्क के रूप में' फ़ंक्शन 'को स्वीकार करने के बजाय कॉलबैक के रूप में कर रहा है। जब तक आपके पास ऐसा करने का कोई अच्छा कारण न हो, तब तक ऐसा न करें। – pmr