一般来说,Boost Bind 在幕后是如何工作的?
在不花很长时间查看 boost 源代码的情况下,有人可以给我一个关于 boost Bind 是如何实现的快速概述吗?
Without spending a long time reviewing the boost source code, could someone give me a quick rundown of how boost bind is implemented?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我喜欢这个
bind
源代码:告诉你几乎所有你需要知道的事情,真的。
bind_template
标头扩展为内联operator()
定义的列表。 例如,最简单的:我们可以看到
BOOST_BIND_RETURN
宏此时扩展为return
,因此该行更像return l_(type...)< /代码>。
单参数版本在这里:
非常相似。
listN
类是参数列表的包装器。 这里有很多深奥的魔法,但我并不太了解。 他们还重载了operator()
来调用神秘的unwrap
函数。 忽略一些编译器特定的重载,它不会做很多事情:命名约定似乎是:
F
是bind
的函数参数的类型。R
是返回类型。L
往往是参数类型的列表。 由于不同数量的参数的重载不少于九个,因此也存在很多复杂性。 最好不要过多关注这一点。I like this piece of the
bind
source:Tells you almost all you need to know, really.
The
bind_template
header expands to a list of inlineoperator()
definitions. For example, the simplest:We can see the
BOOST_BIND_RETURN
macro expands toreturn
at this point so the line is more likereturn l_(type...)
.The one parameter version is here:
It's pretty similar.
The
listN
classes are wrappers for the parameter lists. There is a lot of deep magic going on here that I don't really understand too much though. They have also overloadedoperator()
that calls the mysteriousunwrap
function. Ignoring some compiler specific overloads, it doesn't do a lot:The naming convention seems to be:
F
is the type of the function parameter tobind
.R
is the return type.L
tends to be a list of parameter types. There are also a lot of complications because there are no less than nine overloads for different numbers of parameters. Best not to dwell on that too much.顺便说一句,如果通过包含
boost/bind/bind_template.hpp
来折叠和简化bind_t
,它会变得更容易理解,如下所示:By the way, if
bind_t
is collapsed and simplified by includingboost/bind/bind_template.hpp
, it becomes easier to understand like the following :我认为它是一个模板类,它为要绑定的参数声明了一个成员变量,并为其余参数声明了重载 () 。
I think it's a template class that declares a member variable for the arguments you want to bind and overloads () for the rest of the arguments.