سؤال

دون إنفاق وقت طويل استعراض دفعة شفرة المصدر ، يمكن للشخص أن تعطيني لمحة سريعة عن كيفية تعزيز ربط التطبيق ؟

هل كانت مفيدة؟

المحلول

أنا أحب هذه القطعة من bind المصدر:

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

};

يقول لك تقريبا كل ما تحتاج إلى معرفته حقا.

على bind_template رأس يوسع إلى قائمة مضمنة operator() التعاريف.على سبيل المثال, أبسط:

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

يمكننا أن نرى BOOST_BIND_RETURN ماكرو توسع return عند هذه النقطة حتى الخط هو أكثر مثل return l_(type...).

واحد المعلمة النسخة هنا:

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

انها مشابهة جدا.

على listN الطبقات هي مغلفة للمعلمة القوائم.هناك الكثير من السحر العميق يحدث هنا أنا حقا لا أفهم كثيرا جدا على الرغم من.كما طاقتها operator() أن المكالمات الغامضة unwrap وظيفة.تجاهل بعض مترجم محددة الزائدة ، فإنه لا يفعل الكثير:

// 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();
}

اصطلاح التسمية يبدو أن: F هو نوع من وظيفة معلمة bind. R هو نوع الإرجاع. L يميل إلى أن يكون قائمة من أنواع المعلمة.هناك أيضا الكثير من المضاعفات لأن هناك ما لا يقل عن تسعة الزائدة عن أعداد مختلفة من المعلمات.أفضل عدم الخوض في هذا كثيرا.

نصائح أخرى

بالمناسبة, إذا bind_t انهار و مبسطة من قبل بما في ذلك boost/bind/bind_template.hpp يصبح من الأسهل فهم كما يلي :

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_;

};

أعتقد أنه قالب الفئة التي تعلن عضو متغير الحجج التي تريد ربط الزائدة () عن بقية الحجج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top