SORU
4 Kasım 2008, Salı


CRTP dinamik polimorfizmi önlemek için

Nasıl sanal üye işlev yükünü önlemek için C CRTP kullanabilir miyim?

CEVAP
4 Kasım 2008, Salı


İki yol vardır.

İlk arayüzü statik olarak türleri yapısının belirterek:

template <class Derived>
struct base {
  void foo() {
    static_cast<Derived *>(this)->foo();
  };
};

struct my_type : base<my_type> {
  void foo(); // required to compile.
};

struct your_type : base<your_type> {
  void foo(); // required to compile.
};

İkinci bir referans-base veya işaretçi-base deyim kullanımı kaçınarak ve bunu derleme zamanında kablolama. Yukarıdaki tanımı kullanarak, bu gibi şablon fonksiyonları olabilir:

template <class T> // T is deduced at compile-time
void bar(base<T> & obj) {
  obj.foo(); // will do static dispatch
}

struct not_derived_from_base { }; // notice, not derived from base

// ...
my_type my_instance;
your_type your_instance;
not_derived_from_base invalid_instance;
bar(my_instance); // will call my_instance.foo()
bar(your_instance); // will call your_instance.foo()
bar(invalid_instance); // compile error, cannot deduce correct overload

Bu yüzden arayüz tanım/yapı ve işlevleri derleme zamanı tür kesintinin birleştirerek statik gönderme yerine sevk dinamik sağlar. Bu statik polimorfizmi özüdür.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • guau . .

    guau . .

    25 Ocak 2008
  • Stanislav Petrov

    Stanislav Pe

    7 ŞUBAT 2009