Вопрос по c++, boost, boost-bind – Как Boost Bind работает за кулисами в целом?

31

Не тратя много времени на просмотр исходного кода boost, не мог бы кто-нибудь дать мне краткое изложение того, как реализовано boost bind?

Ваш Ответ

3   ответа
24

Мне нравится этот кусок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 как правило, список типов параметров. Есть также много сложностей, потому что существует не менее девяти перегрузок для различного числа параметров. Лучше не останавливаться на этом слишком много.

@ Ha11owed, потому что таким образом они могут использовать заголовок для шаблонов, которые не имеют возвращаемого значения!
Я все еще не понял этого. Как вызвать конструкторbind_t?
это не кажется простым для меня ... почему#define BOOST_BIND_RETURN return необходимо ? почему бы просто не вернуться?
0

Я думаю, что это шаблонный класс, который объявляет переменную-член для аргументов, которые вы хотите связать, и перегрузку () для остальных аргументов.

2

Кстати, если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_;

};

Похожие вопросы