2016-12-01 9 views
5

के साथ सीआरटीपी का उपयोग करना मेरे पास कक्षाओं का एक समूह है जो समान व्यवसाय विधियों को लागू करता है। मैं प्रदर्शन कारणों से वर्चुअल प्रेषण के बजाय सीआरटीपी का उपयोग करने की योजना बना रहा हूं। लेकिन मैं एक एकल इंटरफ़ेस को कोडिंग की सुविधा रखना चाहता हूं जो विरासत और वर्चुअल विधियों के साथ आता है।एक इंटरफ़ेस

क्या मेरे विशेष वर्गों को एक टेम्पलेटेड अमूर्त वर्ग से प्राप्त करना ठीक है, जो सामान्य कोड रखने के लिए सीआरटीपी का उपयोग करेगा, और शुद्ध वर्चुअल क्लास से भी प्राप्त होगा, इसलिए मैं प्रत्येक प्रकार के उदाहरण बना सकता हूं लेकिन मेरा क्लाइंट कोड केवल इंटरफ़ेस पर निर्भर करता है? इससे भी बेहतर, मैं एकाधिक कार्यान्वयन करते समय क्लाइंट कोड में एक इंटरफेस प्रदान करने के लिए सीआरटीपी का उपयोग कैसे कर सकता हूं?

+0

सार विधि एक अच्छा विचार नहीं है ... आप CRTP का उपयोग आभासी प्रेषण है कि से बचने के लिए: आप इस तरह एक दृष्टिकोण है, जो पूरी तरह से वैध है उपयोग कर सकते हैं क्यों इसका सामान्य वैकल्पिक नाम स्थैतिक बहुरूपता है .. निश्चित रूप से सिंटेक्टिक बिंदु से कोई भी आपको ऐसा करने से रोक नहीं सकता है, लेकिन IMHO आपको इसे सोचने की आवश्यकता है ... –

+0

सार्वजनिक विधियां केवल इंटरफ़ेस में नहीं होंगी, केवल विशेषज्ञता में। – ruipacheco

उत्तर

5

निश्चित रूप से। यदि आप प्रदर्शन कारणों की वजह से अपने कोड refactor करने की योजना अच्छी तरह से

class Interface 
{ 
public: 
    virtual void doSomething() = 0; 
    //... 
}; 

template<typename T> 
class GeneralImpl : public Interface 
{ 
public: 

    void doSomething() override 
    { 
     auto someDetail = T::somethingStatic(); 
     //... 
     static_cast<T*>(this)->someMember(); 
     //... 
    } 
} 

class SpecificImpl : public GeneralImpl<SpecificImpl> 
{ 
public: 
    static int somethingStatic() 
    { 
     //... 
    } 

    void someMember() 
    { 
     //... 
    } 
}; 

int main() 
{ 
    std::vector<Interface*> vec; 
    SpecificImpl instance; 

    //... 

    vec.push_back(&instance); 

    //... 

    for(auto* inst : vec) { 
     inst->doSomething(); 
    } 

    //... 
} 
+0

रनटाइम लागत केवल शुद्ध आभासी कार्यों का उपयोग करने के समान ही होगी? – ruipacheco

+0

हां, क्योंकि टेम्पलेट्स में कोई रनटाइम ओवरहेड नहीं है। – Smeeheey

+0

तो इस कोड को देखते हुए सीआरटीपी केवल शुद्ध वर्चुअल फ़ंक्शंस का उपयोग करने की तुलना में मुझे अधिक नहीं देगा? मेरे पास समान प्रदर्शन जुर्माना है? – ruipacheco

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