मैं कुछ वर्गों को देखते हुए किया गया है, और केवल एक उपयोग .Open विधि है, जबकि दूसरों .loadC++ टेम्पलेट एक लाइन अंतर
का उपयोग कोई होशियार तरह से कुछ प्राप्त करने के लिए है नीचे (सरलीकृत) कोड की तरह? या मुझे उपरोक्त वर्ग की परिभाषाओं को संपादित करना चाहिए?
template <class element> bool load (element & el, std::string file) {
bool status;
if (std::is_same <element, some_special_class>::value) {
status = el.open (file);
} else {
status = el.load (file);
}
// lot of code, based on status
return status;
}
यह लगता है थोड़ा बेहतर
void lotOfCode (bool status) {
if (status) {
// some code
} else {
// more code
}
}
template <class el> bool load (el & e, std::string f) {
bool status = e.load (f);
lotOfCode (status);
return status;
}
bool load (some_special_class & e, std::string f) {
bool status = e.open (f);
lotOfCode (status);
return status;
}
इस
template <class element> bool load (element & el, std::string file) {
if (el.load (file)) {
// some code
return true; // loaded
}
// more code
return false;
}
bool load (some_special_class & el, std::string file) {
if (el.open (file)) {
// some code
return true; // loaded
}
// more code
return false;
}
से
लेकिन यह काफी अच्छा है?
जब तक दोनों वर्गों में 'खुला' ** और ** 'load' नहीं है, तो पहला संस्करण संकलित नहीं होगा। भले ही। आपकी सहजता बहुत अच्छी है। ओवरलोडिंग 'std :: is_same' सशर्तयों के समूह के साथ विशाल टेम्पलेट कार्यों से बेहतर है। जिसने आपको कक्षाएं दी हैं, वे सी ++ को समझते हैं और साथ ही वे सोचते हैं। – StoryTeller
आपका कोड जीतता है। – AndyG
आप सी ++ 17 में 'if constexpr' के लिए प्रतीक्षा कर सकते हैं? : डी –