SORU
13 Kasım 2010, CUMARTESİ


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
13 Kasım 2010, CUMARTESİ


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • booba1234

    booba1234

    22 Temmuz 2006
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008
  • Wronchi Animation

    Wronchi Anim

    9 Mayıs 2011