2016-12-30 10 views
6

मैं कुछ वर्गों को देखते हुए किया गया है, और केवल एक उपयोग .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; 
} 

से

लेकिन यह काफी अच्छा है?

+3

जब तक दोनों वर्गों में 'खुला' ** और ** 'load' नहीं है, तो पहला संस्करण संकलित नहीं होगा। भले ही। आपकी सहजता बहुत अच्छी है। ओवरलोडिंग 'std :: is_same' सशर्तयों के समूह के साथ विशाल टेम्पलेट कार्यों से बेहतर है। जिसने आपको कक्षाएं दी हैं, वे सी ++ को समझते हैं और साथ ही वे सोचते हैं। – StoryTeller

+0

आपका कोड जीतता है। – AndyG

+1

आप सी ++ 17 में 'if constexpr' के लिए प्रतीक्षा कर सकते हैं? : डी –

उत्तर

3

वास्तविक कोड मानना ​​उतना आसान नहीं है जितना पोस्ट किया गया है, यह फ़ंक्शन टेम्पलेट को वास्तव में लागू होने वाले ऑपरेशन के साथ अनुकूलित करने के लिए उचित हो सकता है। उदाहरण के लिए:

template <typename T> 
bool load_aux(T& t, std::string const& s) { return t.load(s); } 
bool load_aux(some_special_case& t, std::string const& s) { return t.open(s); } 

template <typename T> 
bool load(T& t, std::string const& s) { 
    if (load_aux(t, s)) { 
     // some code 
     return true; 
    } 
    // some more code 
    return false; 
} 
+0

से/implicitly परिवर्तनीय से प्राप्त कोई वर्ग नहीं है तो यह (मेरे दूसरे प्रयास से बेहतर तरीका) एकमात्र तरीका है? – EdwinIsBack

+1

@EdwinIsBack: जाहिर है, कई समाधान हैं। जो सबसे उपयुक्त है वास्तविक उपयोग पर निर्भर करता है। यदि आपने वर्णन किया है तो मुझे लगता है कि अलग-अलग परिचालनों के लिए एक आम नोटेशन प्रदान करने का मेरा प्रस्ताव काफी आगे है। यदि फ़ंक्शन को अलग-अलग स्थान से बुलाया जाता है तो सामान्य कार्य को अनुकूलित करने के लिए मुझे लैम्ब्डा फ़ंक्शन में प्रवेश करना उचित होगा। –

+0

जब तक यह काम करता है। लेकिन नामकरण स्थिरता को लागू करने के लिए एक छोटा इंटरफ़ेस डालना (मेरे लिए) कम विज्ञापन-प्रसार और अधिक पठनीय और रखरखाव योग्य है जिसे आपने प्रस्तावित किया था। ध्यान दें कि इंटरफ़ेस प्रत्येक वर्ग की एकवचनता को कैसे संरक्षित करता है, इसे अपने नामस्थान में अलग किया जा सकता है, इसे अन्य कार्यों, आदि द्वारा आसानी से पुन: उपयोग किया जा सकता है। –

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