2008-09-22 11 views

cevap

24

Ben bind kaynağının bu parça gibi.

bind_template başlığı, satır içi operator() tanımları listesine genişler. Örneğin, en basit: satır daha return l_(type...) gibi yani

result_type operator()() 
{ 
    list0 a; 
    BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); 
} 

Biz bu noktada return için BOOST_BIND_RETURN makro Genişlediğinde görebilirsiniz.

bir parametre versiyonu

buradadır:

template<class A1> result_type operator()(A1 & a1) 
{ 
    list1<A1 &> a(a1); 
    BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0); 
} 

Oldukça benzer.

listN sınıfları, parametre listeleri için paketleyicidir. Burada çok fazla derin bir sihirbazlık var, aslında çok fazla anlamadım. Onlar da gizemli unwrap işlevini çağıran operator() aşırı yüklü. Bazı derleyici özgü aşırı gözardı ederek, bir sürü yapmaz:

// unwrap 

template<class F> inline F & unwrap(F * f, long) 
{ 
    return *f; 
} 

template<class F> inline F & unwrap(reference_wrapper<F> * f, int) 
{ 
    return f->get(); 
} 

template<class F> inline F & unwrap(reference_wrapper<F> const * f, int) 
{ 
    return f->get(); 
} 

adlandırma kuralı gibi görünüyor: Fbind işlev parametresinin türüdür. R dönüş türüdür. L, parametre türlerinin bir listesi olma eğilimindedir. Çok sayıda komplikasyon da var çünkü farklı sayıda parametre için en az dokuz aşırı yüklenme var. Bu konuda fazla durmamak için en iyisi. bind_tboost/bind/bind_template.hpp dahil ederek çöktü ve basitleştirilmiş eğer arada

+2

bu neden '# beni ... basit görünmüyor BOOST_BIND_RETURN dönüşü gerekli mi? neden sadece geri dönmüyor? – Ha11owed

+0

Hala anlamadım. Oluşturucuyu “bind_t” olarak adlandırır mısınız? – ThomasMcLeod

+2

@ Ha11owed bu nedenle, dönüş değerini olmayan şablonlar için üstbilgiyi kullanabilirler! –

0

Sanırım bu, argümanların geri kalanı için bağlamak istediğiniz argümanlar için bir üye değişkeni olduğunu bildiren bir şablon sınıfıdır.

template<class R, class F, class L> class bind_t 
{ 
public: 

    typedef bind_t this_type; 

    bind_t(F f, L const & l): f_(f), l_(l) {} 

#define BOOST_BIND_RETURN return 
#include <boost/bind/bind_template.hpp> 
#undef BOOST_BIND_RETURN 

}; 

neredeyse bilmeniz gereken tüm gerçekten anlatır:

2

, gibi anlamak daha kolay hale gelir şu:

template<class R, class F, class L> 
class bind_t 
{ 
    public: 

     typedef bind_t this_type; 

     bind_t(F f, L const & l): f_(f), l_(l) {} 

     typedef typename result_traits<R, F>::type result_type; 
     ... 
     template<class A1> 
      result_type operator()(A1 & a1) 
      { 
       list1<A1 &> a(a1); 
       return l_(type<result_type>(), f_, a, 0); 
      } 
    private: 
     F f_; 
     L l_; 

}; 
İlgili konular