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

  • Christian Atlas

    Christian At

    26 Mart 2009
  • Metheud

    Metheud

    9 EYLÜL 2006
  • TomSka

    TomSka

    30 Mayıs 2006