एक और उत्तर से बताया गया है, bool
रूपांतरण के लिए सूचक करने वाली चार पसंद किया जाता है क्योंकि इसमें कोई उपयोगकर्ता-निर्धारित रूपांतरण शामिल है, जबकि std::string
रूपांतरण उस में एक उपयोगकर्ता-निर्धारित रूपांतरण है।
सी ++ 11 मैन्युअल प्रकार नियंत्रण करने की क्षमता प्रदान करता है।
template<size_t n>
struct enumarated_enum {
private:
enum empty {};
};
template<bool b, size_t n=0>
using EnableIf = typename std::enable_if< b, typename enumerated_enum<n>::empty >::type;
template<typename String, EnableIf< std::is_convertible< String, std::string >::value >... >
Foo& operator=(String&& s) {
cout << "string overload" << "\n";
}
// either this:
template<typename Bool, EnableIf< !std::is_convertible< Bool, std::string >::value && std::is_convertible< Bool, bool >::value, 1 >... >
Foo& operator=(Bool&& b) {
cout << "bool overload" << "\n";
}
// or this:
Foo& operator=(bool b) {
cout << "bool overload" << "\n";
}
जहाँ हम पूरी तरह से एक प्रकार से मेल खाते हैं अगर यह एक std::string
में बदला जा सकता है, और टेम्पलेट से मेल नहीं खाता है, तो यह std::string
में परिवर्तित नहीं किया जा सकता है और अन्य भार के को देखा जाता है।
यदि आपके पास कई प्रकार के समर्थन हैं जो आप समर्थन करने में सक्षम होना चाहते हैं, तो आपको लंबे लॉजिकल रूपों का उपयोग करना होगा जो वर्णन करते हैं कि आप किस ओवरलोड को चलाने के लिए चाहते हैं, और सुनिश्चित करें कि अन्य इसे स्वीकार नहीं करते हैं (निर्माण के साथ नहीं ऊपर)। यदि आपके पास केवल दो प्रकार हैं, तो दूसरा प्रकार पारंपरिक अधिभार हो सकता है। टेम्पलेट अधिभार कुछ भी है कि पारंपरिक अधिभार बिल्कुल मेल नहीं खाता में पहली दरार हो जाता है ...
(दूसरा टेम्पलेट तर्क गिने enum
रों की एक variardic सूची जो मौजूद नहीं कर सकते, जिसका एकमात्र उद्देश्य यह सुनिश्चित करना है कि दो टेम्पलेट्स संकलक के लिए पर्याप्त तरीकों से भिन्न नहीं हैं।)
क्या? उस अधिभार में केवल एक यूडीटी है। (इसके अलावा, 100% सही) –
@MooingDuck हाँ, आप सही हैं। जब मैंने बिना सोच के जवाब टाइप किया तो यह समझ में आया! – juanchopanza
+1: यह भाषा में नए आने वालों को आश्चर्यचकित कर सकता है कि मानक द्वारा परिभाषित एक प्रकार को ** उपयोगकर्ता ** - परिभाषित प्रकार के रूप में वर्गीकृत किया जाएगा, लेकिन वहां आप जाते हैं! – Johnsyweb