Merakla yinelenen şablon kalıbı (CRTP) nedir?
Herkes bir kod örneği ile CRTP
için iyi bir açıklama lütfen?
Lütfen sormayın bana bakın bir kitap, zaten var olan kitaplar ve bakın onları ama genelde bulun açıklamalar/örnekler siz gelmek ile çok daha uygun ve pratik anlama kavramı ve çok önemli diğer ince şeyler gidip bir kavram.
CEVAP
Kısacası, CRTP bir sınıf Bir sınıf için bir şablonu uzmanlaşma olan temel bir sınıf olduğunda kendisi. E. g.
template <class T> class X{...};
class A : public X<A> {...};
merakla yinelenen, değil mi? :)
Şimdi, bu size ne söylüyor? Bu aslında X şablonu kendi uzmanlık için bir temel sınıf için yeteneği verir.
Örneğin, genel singleton bir sınıf (sürüm basitleştirilmiş) bu gibi yapabilirsin
template <class ActualClass>
class Singleton
{
public:
static ActualClass& GetInstance()
{
if(p == 0)
p = new ActualClass;
return *p;
}
protected:
static Actualclass* p;
private:
Singleton(){}
Singleton(Singleton const &);
Singleton& operator = (Singleton const &);
};
template <class T>
T* Singleton<T>::p = 0;
Keyfi bir sınıf yapmak için şimdi, Bir tek bunu yapmanız gerekir
class A: public Singleton<A>
{
//Rest of functionality
};
Görüyor musun? Singleton şablonu herhangi bir türü için kendi uzmanlık X singleton<X>
miras olacak ve böylece(kamu, korumalı) tüm üyeleri tarafından erişilebilir, GetInstance
dahil varsayar! CRTP diğer yararlı kullanımları vardır. Örneğin, eğer sen de istersen say tüm bu örnekleri şu anda mevcut sınıf için, ama istiyorum saklanması bu mantık içinde ayrı bir şablon (fikir için bir beton sınıfı oldukça basit bir statik değişken, az artırma, eksiltme yer dtors). Bir egzersiz olarak bunu deneyin!
Başka yararlı bir örnek, artırmak için uygulanan, onlar nasıl emin değilim, ama CRTP da işe yarar). Sadece operatör < sağlamak için; sınıflar için istiyorum ama otomatik olarak operator == onlar için hayal!
bu şekilde yapabilirsin:
template<class Derived>
class Equality
{
};
template <class Derived>
bool operator == (Equality<Derived> const& op1, Equality<Derived> const & op2)
{
Derived const& d1 = static_cast<Derived const&>(op1);//you assume this works
//because you know that the dynamic type will actually be your template parameter.
//wonderful, isnit it?
Derived const& d2 = static_cast<Derived const&>(op2);
return !(d1 < d2) && !(d2 < d1);//assuming derived has operator <
}
Şimdi bu şekilde kullanabilirsiniz
struct Apple:public Equality<Apple>
{
int size;
};
bool operator < (Apple const & a1, Apple const& a2)
{
return a1.size < a2.size;
}
şimdi, açıkça operatör elma == sağlamadın? Ama senin var! Yazabilirsiniz
int main()
{
Apple a1;
Apple a2;
a1.size = 10;
a2.size = 10;
if(a1 == a2) //the compiler won't complain!
{
}
}
Bu sadece operatör Elma == yazmıştı, ama Eşitlik şablon sadece ^ ama == sağlayacağını hayal ederse daha az yazarsınız gibi . , >= , &;= lt vb. Ve bu tanımlar için kullanabilirsinizbirden fazlasınıflar, kodu yeniden!
CRTP harika bir şey :) HTH
Şablon yöntemi ve strateji desen arası...
Şablon bir sınıf arasındaki fark ve sı...
'çağrı şablon arasındaki farkı�...
Python için hızlı şablon Sistemi nedir...
C standart devlet int boyutu, uzun tür...