boost::bind

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

最近在几经波折之后,终于对于boost::bind有点理解了。对于习惯了其他语言的人来说,boost::bind是个挺神奇的东西,它可以将你的方法适配成任何其他的方法。其实这得益于c++的模板以及操作符重载,去看boost::bind的实现就会发现它是一个有n多重载的函数,这些重载主要是为了适应函数的参数个数。

 

其实boost::bind的原理是函数对象,而函数对象就是一个重载了()操作符的对象,这样我们就可以像调用一个方法一样来调用一个类上的这个操作符,比如a(),其实你是在调用a这个对象的()方法,而不是调用一个叫a的方法。

 

一般来说boost::bind有两种方式的调用,一种是对自由方法,也取非类方法, 一种是对类方法。

 

对自由方法来说,直接boost::bind(函数名, 参数1,参数2,...)

对类方法来说,直接boost::bind(&类名::方法名,类实例指针,参数1,参数2)

 

这里需要额外注意的问题是,函数对象也可以像自由方法一样被bind,而boost::function也是一种函数对象。

 

接下来我们需要注意什么情况下需要用_1, _2这样的参数。

 

举个例子

void test(int a, int b, int c)

 

boost::bind(test, 1, _1, _2)得到一个函数对象b,当我们调用b(3,4)时,相当于调用test(1,3,4)

boost::bind(test, _2, 3, _1)得到一个函数对象b,当我们调用b(3,4)时,相当于调用test(4,3,3)

 

看明白了没有?你实际上可以指定一些常量和一些占位符进去,_x这样的就是占位符,_1表示实际调用时的参数位置,也即b(3,4)时_1代表3,_2代表4

 

当然你也可以将所有的参数都指定

比如boost::bind(test,1,2,3),那么在调用b()时就相当于调用test(1,2,3)

 

需要注意的一点是,boost::bind里的参数个数一定要与被bind的函数相同,否则这个函数对象就无法生成了,编译器会抱怨一堆信息,如果你仔细看的话,它是在告诉你,没有这样的函数,你实际的函数是....,这是使用c++很杯具的一点,当遇到模板时,一旦报错,那些信息直接可以令人崩溃。

 

在asio中,boost::bind被大量使用,原因是异步的情况下,每个函数的调用是独立的,它的所有信息应该包含在它的调用,也即函数对象中。因此asio中有大量的模板,如果在这种情况下你想要使用虚函数或者继承来写框架的话,会是一件很杯具的事情,在碰了很多次壁之后,我发现其实很多情况下我并不需要纯虚函数,我需要的只是一个函数指针,或者函数对象而已。

boost::function和boost:bind取代虚函数 boost::function和boost:bind取代虚函数 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。boost::function和boost::bind已经纳入了std::tr1,这或许是C++0x最值得期待的功能,它将彻底改变C++库的设计方式,以及应 阅读详情

相关推荐

使用boost::bind/std::bind进行封…

boost::bind( ps:在c++11中被引入标准库,变成std::bind) 是C++进行封包操作的利器。可以很简单地把一个函数(包括类成员函数)调用及其部分/全部参数封装成一个对象(boost::function),以供之后调用。可以理解成这是对C语言函数指针的升级,毕竟使用函数指针来进行回调,经常是用void*来指定上下文,麻烦且容易出错。       boost::bind的实现原

runyon的博客 1462

boost::bind 详解

使用 boost::bind是标准库函数std::bind1st和std::bind2nd的一种泛化形式。其可以支持函数对象、函数、函数指针、成员函数指针,并且绑定任意参数到某个指定值上或者将输入参数传入任意位置。 1. 通过functions和function pointers使用bind 给定如下函数: 1 int f(int a, int b) 2 { 3 retur...

weixin_34227447的博客 821

boost::bind 不能处理函数重载 (error: no matching function for call to ‘bind‘)

🚀 优质资源分享 🚀 学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 前言 最近任务多、工期紧,没有时间更新博客,就水一期吧。虽然是水,也不能太失水准,刚好最近工作中遇到一个 boost::bind 的问题,花费了半天时间来定位解决,就说

m0_56069948的博客 1302

boost::bind的使用

<br />最近在几经波折之后,终于对于boost::bind有点理解了。对于习惯了其他语言的人来说,boost::bind是个挺神奇的东西,它可以将你的方法适配成任何其他的方法。其实这得益于c++的模板以及操作符重载,去看boost::bind的实现就会发现它是一个有n多重载的函数,这些重载主要是为了适应函数的参数个数。<br /> <br />其实boost::bind的原理是函数对象,而函数对象就是一个重载了()操作符的对象,这样我们就可以像调用一个方法一样来调用一个类上的这个操作符,比如a(),其实

无心云 3万+

Boost::bind使用详解

boost::bind

zxnzjccmily的博客 2345

关于c++ boost::bind的一些理解

1 介绍 一般来说boost::bind有两种方式的调用,一种是对自由方法,也取非类方法, 一种是对类方法。 方式一: 直接boost::bind(函数名, 参数1,参数2,…) 方式二: 对类方法来说,直接boost::bind(&类名::方法名,类实例指针,参数1,参数2) 而boost::function也是一种函数对象。 需要注意的一点是,boost::bind里的参数个数一定要与被bind的函数相同。 2 用法 【bind】 一般用法:bind用于一般普通函数( 以非类、结构的成员函数 )

bj318318的博客 6750

boost::asio序列: boost::bind 和 std::bind

1. 采用boost::bind #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/date_time/posix_time/posix_time.hpp> void print(const boost::system:...

hit1524468的专栏 1399

Boost警告:关于 boost::bind 的使用

qq_45762996的博客 861

boost::bind的理解与使用

最近在几经波折之后,终于对于boost::bind有点理解了。对于习惯了其他语言的人来说,boost::bind是个挺神奇的东西,它可以将你的方法适配成任何其他的方法。其实这得益于c++的模板以及操作符重载,去看boost::bind的实现就会发现它是一个有n多重载的函数,这些重载主要是为了适应函数的参数个数。   其实boost::bind的原理是函数对象,而函数对象就是一个重载了()操作符

jack_20的博客 8423

boost::bind对引用的特殊处理

最近使用boost::bind比较多,发现有一些奇怪的现象。就是在用boost::bind传递引用的时候,如果引用的对象被释放,那么之后的函数执行必然会访问无效的地址儿出错。但是这个担忧是多余的,boost::bind在传递引用的时候,并不是真的传递引用,而是执行对象的拷贝构造函数重新生成了一个全新的对象,测试代码如下: #include<iostream> #include ...

hacker_lpy的博客 806

boost::bind 的作用

Boost::bind是一个强大的C++库组件,用于处理函数对象和参数的绑定,提供了更灵活的函数调用方式。它在处理回调、STL算法和其他需要函数对象的情况下非常有用。然而,需要注意的是,C++11引入了更现代的函数绑定和Lambda表达式,通常更方便。

点云兔子的博客 522

Please use boost/bind/bind.hpp + using namespace boost::placeholders

The practice of declaring the Bind placeholders (_1, _2, …) in the global namespace is deprecated. Please use <boost/bind/bind.hpp> + using namespace boost::placeholders, or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior. 提示war

Betterc5的博客 4389

boost::bind的几种使用

1. boost::bind与函数对象的结合使用: 有这样一个函数对象: template struct iStrLess : public std::binary_function { public: bool operator () (const _Ty& left, const _Ty& right) const { _Ty ileft = boost::to_upper_c

zeroom的技术专栏 1485

ROS用 lambda 替代 boost::bind

lambda 替代 bind 的核心:用 [this] 捕获对象(对应原 this ),用 lambda 参数 goal 接收 ROS 自动传入的目标(对应原 _1 ),其余逻辑、参数传递时机完全不变,写法更简洁现代。_1 lambda 参数 const auto& goal 这个 goal 就是原 _1 对应的“后续补的参数”,由 ROS 框架在收到客户端目标时自动传入(和你之前问的“补参数”时机、来源完全不变)完整可运行片段(结合你的类,直接用)

ULTRAmanTAROACE的博客 266

探究boost::bind的实现

泛化的bind实用性很强,支持将泛化函数(函数、函数指针、仿函数、与成员函数)与运行期实参的动态绑定;在实际工程中也经常作为基础工具集之一被频繁地使用;我计划投入一定的精力,仔细阅读boost库中的基础工具集的代码实现(bind是第一个);旨在了解这些工具的内部实现机理同时也提高下自己的C++语言泛型编程技术,以备后续的实际工程中使用;   2005年,Andrei Alexandresc...

SUNKIST 277
上一篇: boost::lexical_cast
下一篇: c++ 连redis
CSLDBLYDX
博客等级 码龄16年 3粉丝 99原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值