当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《一般来说,boost绑定如何在幕后工作?》经验,为你挑选了1个好方法。

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



1> 1800 INFORMA..:

我喜欢这个bind来源:

template 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 
#undef BOOST_BIND_RETURN

};

告诉你几乎所有你需要知道的,真的.

bind_template头扩展到内联的列表operator()定义.例如,最简单的:

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

我们可以看到BOOST_BIND_RETURNreturn在这一点扩展到所以线更像return l_(type...).

一个参数版本在这里:

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

它非常相似.

这些listN类是参数列表的包装器.这里有很多深刻的魔法,但我真的不太懂.他们也超负荷operator()调用了神秘的unwrap功能.忽略一些特定于编译器的重载,它不会做很多事情:

// unwrap

template inline F & unwrap(F * f, long)
{
    return *f;
}

template inline F & unwrap(reference_wrapper * f, int)
{
    return f->get();
}

template inline F & unwrap(reference_wrapper const * f, int)
{
    return f->get();
}

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


这对我来说似乎并不简单...为什么`#define BOOST_BIND_RETURN返回'必要?为什么不回来?
@ Ha11owed因为这样他们可以使用标题来获得没有返回值的模板!
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有