كيف لا زيادة ربط العمل وراء الكواليس ؟
-
02-07-2019 - |
سؤال
دون إنفاق وقت طويل استعراض دفعة شفرة المصدر ، يمكن للشخص أن تعطيني لمحة سريعة عن كيفية تعزيز ربط التطبيق ؟
المحلول
أنا أحب هذه القطعة من 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_;
};
أعتقد أنه قالب الفئة التي تعلن عضو متغير الحجج التي تريد ربط الزائدة () عن بقية الحجج.