Вопрос

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

Это было полезно?

Решение

Мне нравится этот фрагмент 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