如果不花很长时间来审查boost源代码,有人可以快速了解一下boost bind的实现方式吗?
我喜欢这个bind
来源:
templateclass 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_RETURN
宏return
在这一点扩展到所以线更像return l_(type...)
.
一个参数版本在这里:
templateresult_type operator()(A1 & a1) { list1 a(a1); BOOST_BIND_RETURN l_(type (), f_, a, 0); }
它非常相似.
这些listN
类是参数列表的包装器.这里有很多深刻的魔法,但我真的不太懂.他们也超负荷operator()
调用了神秘的unwrap
功能.忽略一些特定于编译器的重载,它不会做很多事情:
// unwrap templateinline 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
往往是参数类型列表.还存在许多复杂情况,因为对于不同数量的参数,存在不少于九次的重载.最好不要过多地纠缠于此.