一般来说,boost绑定如何在幕后工作?

时间:2008-09-22 01:09:15

标签: c++ boost boost-bind

如果不花很长时间审查boost源代码,有人可以快速了解一下boost bind的实现方式吗?

3 个答案:

答案 0 :(得分: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();
}

命名约定似乎是:Fbind的函数参数的类型。 R是返回类型。 L往往是参数类型列表。还存在许多复杂情况,因为对于不同数量的参数,存在不少于九次的重载。最好不要过多地纠缠于此。

答案 1 :(得分: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_;

};

答案 2 :(得分:0)

我认为它是一个模板类,它为你想要绑定的参数声明一个成员变量,并为其余参数重载()。