首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通常情况下,boost绑定是如何在幕后工作的?

通常情况下,boost绑定是如何在幕后工作的?
EN

Stack Overflow用户
提问于 2008-09-21 17:09:15
回答 3查看 12.1K关注 0票数 33

在不花很长时间回顾boost源代码的情况下,有人能给我简要介绍一下boost bind是如何实现的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-09-21 20:10:20

我喜欢这段bind源代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()定义的列表。例如,最简单的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
result_type operator()()
{
    list0 a;
    BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}

我们可以看到,此时BOOST_BIND_RETURN宏扩展为return,因此这行代码更像是return l_(type...)

单参数版本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<class A1> result_type operator()(A1 & a1)
{
    list1<A1 &> a(a1);
    BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}

它非常相似。

listN类是参数列表的包装器。这里有很多深刻的魔法,但我并不是很了解。它们还重载了调用神秘unwrap函数的operator()。忽略一些特定于编译器的重载,它不会做很多事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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往往是参数类型的列表。还有很多复杂的问题,因为对于不同数量的参数,至少有9个重载。最好不要在这上面纠结太多。

票数 25
EN

Stack Overflow用户

发布于 2009-12-03 13:10:26

顺便说一下,如果通过包含boost/bind/bind_template.hpp来折叠和简化bind_t,则会变得更容易理解,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
EN

Stack Overflow用户

发布于 2008-09-21 17:19:42

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/112738

复制
相关文章
如何判定是否一份适合工作呢
春节仿佛还在昨天,转眼间2023年已经过半。分享和总结一下自己过去的这6个月吧!你可以从以下几个方面展开谈谈。
zhangrelay
2023/07/24
2.2K0
如何判定是否一份适合工作呢
boost::string or boost::regex
当中用蓝色标记出的部分(layout, local_size_x, local_size_y, local_size_z, in)为keyword,斜体字部分(a, b, c)为数据类型为unsigned int的数字,请编写一个函数,用于从文件里抽取出a, b, c的值。当中文件名称为输入參数,该函数的返回值是抽取得到的a,b,c三个值。
全栈程序员站长
2022/07/08
2.1K0
CPU绑核的意义
进程或者线程绑定到某个CPU Core,仍然可能会有线程或者进程切换的发生,如果想到达到进一步减少其他进程对于该进程或者线程影响,可以采取把CPU Core从Linux内核调度中剥离出来。Linux内核提供isolcpus,对于有4个CPU core的系统,在启动时候加入isolcpus=2,3,那么系统启动后将不会使用CPU3,CPU4.这里的不适用不是绝对的,但是可以通过taskset命令来设置
用户4700054
2022/08/17
3K0
CPU绑核的意义
SpringBoot的幕后推手...
​  这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作都会被深深地鄙视,不过在我们开始SpringBoot之旅前,我们先回顾和探索一下Spring框架的本质,然后一点点的很自然的过渡到SpringBoot,这样对于我们深刻理解SpringBoot也是非常有帮助的。
阿豪聊干货
2018/08/09
3850
SpringBoot的幕后推手...
Boost
我今天真的是被这个boost库搞到头炸,怎么在linux下安装boost库,及后续使用。一开始用sudo apt-get install libboost-dev倒是能解决代码中头文件引用不存在问题,但是编译不成功,总是会出现什么未定义引用错误,之后remove掉,重新下载源码编译还是会存在一些问题。
用户1145562
2020/10/23
2K0
boost::bind和boost::function使用示例
C++11已支持bind和function,之前的不支持,但可以借助boost达到同样目的。看如下两段代码:
一见
2018/08/10
1.3K0
当你不技如人时,怎样把心仪的工作抢到手?
<!-- 最牛b的未必是最好使的 --> 找工作,难免技不如人,这很正常。但找工作毕竟不是武林大会,不是你武功最高就真的最牛。求职这事一看本事,二看缘分。有些时候来面试的人本领到位了,但双方就是看不上眼儿。就像网上传的招女秘书的笑话,来面试的会英语、会开车、会这会那的,到最后录用了胸最大的那个。呵呵,是个笑话没错,但毕竟影射了某些现实。 啥现实? 1、本领高强不是一切; 2、社会是复杂的; 3、真正的用人需求都在表面之下; <!-- 先看是什么“坑”,再看自己是什么“萝卜” --> 好吧,技不如人短期内已成
web前端教室
2018/02/07
1.6K0
JS解绑事件
传统方式 el.onclick=function(){ alert(0) el.onclick=null;//解绑事件 } addEventListener function fn(){ alert(0) el.removeEventListener('click',fn);//点击后移除事件 } el.addEventListener('click',fn)//监听事件
切图仔
2022/09/08
1.5K0
【综合篇】浏览器的工作原理:浏览器幕后揭秘
浏览器的发展历程的三大路线,第一是应用程序web化,第二是web应用移动化,第三是web操作系统化。是不是有点不直白。
达达前端
2020/02/18
8210
【综合篇】浏览器的工作原理:浏览器幕后揭秘
boost编译
经历了将近半年多的时间boost终于发布了1.35.0版本(前版本1.34.1发布于2007/7), 其编译方法和原来的编译方法基本上是一致的,主要改变包括1.34.0以来bjam的toolset所 提供的参数名称的改变(具体参见《boost1.34.0编译日志》)外,还包括bjam的编译默认 选项的变化,在1.35.0之前的版本默认编译时会自动编译各种版本的库,包括静态库、 动态库、debug库和release库等全部的版本,但是到了1.35.0时默认的选择仅仅编译release 版本的库,这样一来在开发的时候就不能进行必要的调试了,为了能够使其编译全部的版本 需要在bjam的命令行参数中添加一个–build-type=complete类型的参数来指明需要编译全 部的版本,所需要编译同时为了使得regex库能够通过ICU库支持Unicode,在编译上需要有 一些特殊的选择。我在Visual Studio 2005 Pro + SP1环境下编译了该库,为了避免走弯路 所以将其编译的方法进行说明,以方便大家编译。 由于boost是采用其自己的bjam工具通过命令行进行编译的,所以必须在Windows下开启console窗口,同时必须将Visual Studio中C++目录下的环境vcvarsall.bat配置脚本运行一遍,以设置好VC的编译器环境变量。 1. 编译不带ICU支持的boost库 此种情况下的boost库编译起来比较的简单,在准备好的console窗口中输入:
用户3519280
2023/07/08
2780
十分钟了解 TypeScript 是如怎样工作的
本文概述了 TypeScript 的工作原理:典型的 TypeScript 项目的结构是什么?什么被编译以及怎样编译?我们如何使用 IDE 编写 TypeScript?
疯狂的技术宅
2020/05/11
1.4K0
十分钟了解 TypeScript 是如怎样工作的
boost::function的用法
本片文章主要介绍boost::function的用法。 boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象。 1.  介绍     Boost.Function 库包含了一个类族的函数对象的包装。它的概念很像广义上的回调函数。其有着和函数指针相同的特性但是又包含了一个调用的接口。一个函数指针能够在能以地方被调用或者作为一个回调函数。boost.function能够代替函数指针并提供更大的灵活性。 2. 使用     Boost.Function 有两种
用户1198337
2018/01/19
1.5K0
解放千万“打工人”,从如流智能工作平台开始
百度如流等玩家们所提供的不仅仅是一个提效、创新的工作方式,还是一种适合新时代和新生代的工作文化。
Alter聊科技
2023/01/12
2040
boost: atomic
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongluck93/article/details/79679571
_gongluck
2019/05/25
1.2K0
boost asio
asio包含errorcode参数的函数,不会抛出异常 可以尝试connect之后,判断错误码, boost::asio::error::already_connected 则表示已经连接 断开连接使用close,is_open不表示通断,close后需要open,connect自动打开
sofu456
2020/09/14
1.4K0
boost编译
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
sofu456
2019/12/10
2.5K0
boost编译
boost 编译
b2 stage --toolset=msvc-14.2 --build-type=complete --stagedir=“stage/MTd/static” link=static runtime-link=static threading=multi address-model=64 debug release 1 /// 跳过指定模块
用户3519280
2023/07/06
2470
boost config
D:\Cgal\cmake\boost_1_55_0_vc142\boost\config
用户3519280
2023/07/08
2310
点击加载更多

相似问题

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

210

幕后的Boost.Asio函数

212

索引如何在幕后工作?

11

执行异步代码,如幕后的承诺。

10

CSS是如何在幕后工作的?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文