2016-12-01 37 views
5

Aynı iş yöntemlerini uygulayan bir dizi dersim var. Performans nedeniyle sanal gönderim yerine CRTP kullanmayı planlıyorum. Ama kodlama kolaylığını kalıtım ve sanal yöntemlerle gelen tek bir arayüzde tutmak isterim.CRTP'yi bir arabirim ile kullanma

Özel sınıflarım, genel kodu tutmak için CRTP kullanan ve aynı zamanda saf bir sanal sınıftan miras alan şablonlu bir sınıftan miras almak ister mi? Böylece her türden örnekler oluşturabilirim ancak istemci kodum var sadece arayüze mi bağlı? Daha da iyisi, birden çok uygulama yaparken, istemci koduna tek bir arabirim sağlamak için CRTP'yi nasıl kullanabilirim?

+0

: Gayet geçerlidir böyle bir yaklaşım kullanabilirsiniz neden ortak alternatif adı statik polimorfizmdir? Elbette sözdizimsel bakış açısından hiç kimse bunu yapmanı engelleyemez, ama IMHO bunu düşünmeniz gerekir ... –

+0

Genel yöntemler sadece arayüzde olmaz. uzmanlıklarda. – ruipacheco

cevap

5

Elbette. Eğer performans nedenlerinden ötürü kodunuzu refactor planlıyorsanız soyut yöntem Sen ise sanal sevk edilmesini önlemek üzere cRTP kullanmak ... iyi bir fikir değildir Eh

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

Çalışma zamanı maliyeti yalnızca salt sanal işlevler kullanılarak aynı mıydı? – ruipacheco

+0

Evet, çünkü şablonların çalışma zamanı tepesi yok. – Smeeheey

+0

Bu yüzden bu koda bakma CRTP, yalnızca salt sanal işlevler kullanıldığında bana çok şey vermiyor? Aynı performans cezası var mı? – ruipacheco