SORU
9 ŞUBAT 2009, PAZARTESİ


nasıl boost::fonksiyon ve boost::bind iş

Fonksiyon<^ bile sihirli kutu kodumu dağılmış...tam olarak nasıl bu iki sınıf temelde herhangi bir fonksiyon bir nesne eşleştirilmesini sağlamak için çalışmak zorunda sevmiyorum . tamamen farklı bir parametre boost::bind geçirmeden bir sohbet için ayarlanmış

Hatta çalışıyor ile farklı arama kuralları (yani üye yöntemleri __thiscall altında VC, ama "normal" fonksiyonlar genellikle __cdecl __stdcall için gereken C ile uyumlu

CEVAP
9 ŞUBAT 2009, PAZARTESİ


boost::function sağlar herhangi bir şey operator() sağ imza bağlı olarak parametre ve sonucu bağlama çağrılabilir bir parametre int, Bu yüzden olabilir bağlı function<void(int)>.

Bu işler böyle (bu açıklama std::function hem de geçerlidir):

boost::bind(&klass::member, instance, 0, _1) böyle bir nesne döndürür

struct unspecified_type
{
  ... some members ...
  return_type operator()(int i) const { return instance->*&klass::member(0, i);
}

return_type int klass::member ve işlev işaretçisi ve bağlı parametre imza algılanır aslında burada nesne saklanır, ama bu önemli değil

Şimdi, boost::function inmedi herhangi bir tür denetleme: Bu alacak herhangi bir nesne ve herhangi bir imza verin şablonu parametre, bir nesne oluşturmak ve bu çağrılabilir göre imza ve çağrı nesne. Eğer bu mümkün değil ise, hata bir derleme.

boost::function aslında bu gibi: bir nesnedir

template <class Sig>
class function
{
  function_impl<Sig>* f;
public:
  return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};

return_type argument_type ** 23 f ayıkladığınız dinamik olarak öbek üzerinde tahsis edilir. Farklı boyutlarda bağlama ile tamamen alakasız nesneler 25 ** izin gerekli.

function_impl sadece soyut bir sınıftır

template <class Sig>
class function_impl
{
public:
  virtual return_type operator()(argument_type arg0) const=0;
};

Tüm çalışmalar sınıfı, beton sınıfı boost::function türetilmiştir. boost::function atadığınız nesnenin her türü için bir tane var

template <class Sig, class Object>
class function_impl_concrete : public function_impl<Sig>
{
  Object o
public:
  virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); }
};

Bu durumda, fonksiyonu artırmak için atama anlamına gelir:

  1. başlatır bir tür function_impl_concrete<void(int), unspecified_type> (o zaman, tabii ki derleme)
  2. öbek üzerinde bu türde yeni bir nesne oluşturur
  3. boost f üyeye bu nesne atar::fonksiyon

İşlevi nesnesi, orijinal işlevi çağrısı direkt uygulama nesne, sanal fonksiyonunu çağırır.

Yasal UYARI: Bu açıklama isimlerini kasten yapılmış olduğunu Unutmayın. Gerçek kişiler veya karakterler için herhangi bir benzerlik ... bunu sen de biliyorsun. Amacı, ilkeleri göstermek için.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DavidParody

    DavidParody

    17 EKİM 2009
  • ICON

    ICON

    19 EKİM 2011
  • Max Lee

    Max Lee

    18 AĞUSTOS 2006