कुलपति ++ 2010 का उपयोग करना, निम्नलिखित दिया:इस टेम्पलेट को ओवरलोड किए गए गैर-टेम्पलेट फ़ंक्शन पर चुनने वाला संकलक क्यों है?
class Base { };
class Derived : public Base { };
template<class T> void foo(T& t); // A
void foo(Base& base); // B
Derived d;
foo(d); // calls A
foo(static_cast<Base&>(d)); // calls B
मैं 'बी' चाहते हैं इसके बाद के संस्करण कहा जाता है। मैं इसे Base
पर एक कलाकार के साथ प्राप्त कर सकता हूं, लेकिन यह आवश्यक क्यों है?
मैं चाहता हूँ टेम्पलेट समारोह सभी प्रकार Base
से प्राप्त नहीं करने के लिए कहा जा करने के लिए (में निर्मित प्रकार, आदि), लेकिन मैं चाहता हूँ गैर टेम्पलेट अधिभार Base
से प्राप्त प्रकार के लिए कहा जाता था, ग्राहक की आवश्यकता के बिना स्पष्ट रूप से कास्ट करने के लिए। मैंने ओवरलोड को टेम्पलेट की विशेषज्ञता बनाने की भी कोशिश की, लेकिन उसी मामले में वही व्यवहार होता है। जो मैं ढूंढ रहा हूं उसे प्राप्त करने का बेवकूफ तरीका क्या है?
क्या यह एक सी ++ 11 चीज है या यह पुराने कोड में भी काम करता है - बस पूछ रहा है क्योंकि यह अच्छा है :)? –
@ w00te: 'is_base_of' और 'enable_if' बूस्ट, सी ++ टीआर 1, और सी ++ 11 में शामिल हैं। उनके लिए कोई सी ++ 11 कार्यक्षमता आवश्यक नहीं है; आप केवल सी ++ 03 भाषा सुविधाओं का उपयोग करके इन्हें परिभाषित कर सकते हैं। –
@ w00te: आप इसे C++ 03 में कर सकते हैं, लेकिन आपको बूस्ट से 'enable_if' और 'is_base_of' को पकड़ना होगा (या अपना खुद का रोल करें, यह आपको सी ++ के बारे में कुछ बातें सिखाएगा)। –