Boost库bind接口轻松实现类成员函数作为回调函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
    C++中,将非类成员函数或者类的静态成员函数作为回调函数实现起来非常简单,但是将类的成员函数作为回调函数使用实现起来就相对较复杂,因为成员函数的调用必须有具体的实例对象支持。最近在学习BOOST库,发现BOOST库实现类成员函数作为回调函数非常容易,故发文以作简单总结。
    简要介绍了BOOST库,BOOST库又被称为C++准标准程序库,库中大部分特性都被收录在C++11中,下面用到的function和bind功能就被收录在C++11中。function是函数对象的“容器”类型,bind绑定成员函数,返回函数对象。bind可以绑定函数指针、函数应用、成员函数指针、函数对象作为回调,在绑定非成员函数或者类静态成员函数时,函数参数最多可以达到9个,在绑定成员函数时,函数参数最多可以达到8个,另外一个用于指明实例对象或者this指针。
    下面指介绍利用bind实现类非静态成员作为回调函数情况,背景这种情况用其他方法实现起来较为复杂。直接上代码:
#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
using namespace std;
using namespace boost;

// 定义回调函数类型
typedef function<int (int x,int y)>  CallBackFunction;       
//typedef int (*CallBackFunction)(int x, int y);             // 不能用于bind函数返回类型

// 类定义
class CMethod2
{
	typedef CMethod2 this_type;
public:
	CMethod2() {}
	~CMethod2() {}
public:
	int Add(int x,int y)                 // 1.类非静态成员函数作为回调函数
	{
		return x + y;
	}
	static int AddS(int x,int y)         // 2.类静态成员函数作为回调函数
	{
		return x + y;
	}
};

int Add(int x,int y)                     // 3.非类成员函数作为回调函数
{
	return x + y;
}

// 测试接口
void Test()
{
	int x = 10;
	int y = 10;
	CMethod2 mtd1;
	CMethod2 &mtd2 = mtd1;
	CMethod2 *mtd3 = &mtd1;
	// 1.对象、对象引用、对象指针都可用于bind绑定类非静态成员函数绑定的实例
	CallBackFunction callBack1 = bind(&CMethod2::Add,&mtd1,_1,_2);
	CallBackFunction callBack2 = bind(&CMethod2::Add,&mtd2,_1,_2);
	CallBackFunction callBack3 = bind(&CMethod2::Add,mtd3,_1,_2);
	cout << "callBack1 Result:" << callBack1(x,y) << endl;
	cout << "callBack2 Result:" << callBack2(x,y) << endl;
	cout << "callBack3 Result:" << callBack3(x,y) << endl;
	// 2.静态成员函数作为回调
	//CallBackFunction callBack4 = CMethod2::AddS;
	CallBackFunction callBack4 = bind(CMethod2::AddS,_1,_2);
	cout << "callBack4 Result:" << callBack4(x,y) << endl;
	// 3.非成员函数作为回调
	//CallBackFunction callBack5 = Add;
	CallBackFunction callBack5 = bind(Add,_1,_2);
	cout << "callBack5 Result:" << callBack5(x,y) << endl;
}


参考资料:
1、Boost库bind接口轻松实现类成员函数作为回调函数

五种将c++类的成员函数用作回调函数的方法——史上最全、最简!!! 前言 在写ROS的cpp代码时发现回调函数十分的常用,然后初学的时候没有深入研究过,记录下几种用法,据说在写线程的时候也很常用。方法五应该是最简单实用的了… 方法一 先从最简单的入手,直接使用普通函数用作回调函数。 #include "pch.h" #include <iostream> using namespace std; class TestCallback { public:... 阅读详情

相关推荐

boost thread类创建和销毁线程示例

boost thread boost thread类使用简单,能够方便地管理整个线程的全生命周期,应用广泛。 thread配合ios使用时,能够方便地创建线程池,具体请参考boost::asio::io_service创建线程池简单实例。 创建线程 对于一般的使用,是启动一个线程,运行一个函数,在函数内完成特定的任务。 #include <boost/thread.hpp> void foo() { cout << "foo" << endl; } boost:

guotianqing的博客 3087

C++中类成员函数作为回调函数

方法一:回调函数为普通函数,但在函数体内执行成员函数 见以下代码: class MyClass { pthread_t TID; public: void func() { //子线程执行代码 } bool startThread() {//启动子线程 int ret = pthread_create( &TID , NULL , callback , this ); if( ret != 0 ) return false; else return tru

我不是码农的博客~~~ 3237

C++中成员函数如何作为回调函数

引言 C++中成员函数在一般情况下是无法作为回调函数的 原因就是因为一般的成员函数在传参时为了可以访问成员变量或者返回本身 会默认的传一个 this 指针 但是回调函数再触发时会返回参数 这就会导致在把成员函数作为回调函数的时候会报参数错误这样一种奇怪的错误 那么如何去避免这种情况呢 本文针对此种情况介绍两种方法 一.类内静态成员函数作为回调函数 我们报错的原因是因为成员函数会隐式的传一个 this 指针,但静态成员函数就不会多这一个参数 所以我们的方法就是把类内静态成员当做回调函数 但这又牵扯到一个问题 

我不是码农的博客~~~ 3472

C++类成员函数回调函数

C++类成员函数回调函数,示例:C++消息注册派发模式

木可的博客 4972

如何使类的成员函数作为回调函数

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为

454

Boostbind接口函数实现类成员函数作为回调函数

C++中,将非类成员函数或者类的静态成员函数作为回调函数实现起来非常简单,但是将类的成员函数作为回调函数使用实现起来就相对较复杂,因为成员函数的调用必须有具体的实例对象支持。最近在学习BOOST,发现BOOST实现类成员函数作为回调函数非常容易,故发文以作简单总结。 简要介绍了BOOSTBOOST又被称为C++准标准程序中大部分特性都被收录在C++11中,下面用到的function...

ankang654321的博客 871

36-C++ Boost 函数绑定回调

Boost中提供了函数对象,可以轻松地把函数的参数和返回值进行绑定,并用于回调函数。这个的核心就是bind函数和function类。bind函数可以将一个函数或函数对象和其参数进行绑定,返回一个新的函数对象。通过这个新的函数对象,我们就可以将原有的函数或函数对象当做参数传来传去,并可以传递附加的参数,方便实现参数绑定和回调函数。function类用于表示一种特定的函数签名,可以在不知道具体函数的类型时进行类型擦除,并把这个函数作为参数传递和存储。

成长需要沉淀。 1395

4.6 C++ Boost 函数绑定回调

Boost中提供了函数对象,可以轻松地把函数的参数和返回值进行绑定,并用于回调函数。这个的核心就是bind函数和function类。bind函数可以将一个函数或函数对象和其参数进行绑定,返回一个新的函数对象。通过这个新的函数对象,我们就可以将原有的函数或函数对象当做参数传来传去,并可以传递附加的参数,方便实现参数绑定和回调函数。function类用于表示一种特定的函数签名,可以在不知道具体函数的类型时进行类型擦除,并把这个函数作为参数传递和存储。通过function类,我们可以在编译时确定函数的类

微软技术分享 1万+

boost::bind 的作用

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

点云兔子的博客 522

boost::bind和占位符实现的原理(from AV BOOST)

boost.bind是个非常强大的工具,有了它,我们可以轻松的将不同模块的代码,从物理上分离,从而达到解耦的作用。 当你开始尝试使用boost.bind来进行编程的时候,你会发现自己不知不觉中贱贱的爱上了boost.bind,因为作用不止是解耦,还有很多说不尽道不明的地方需要它。 但是从来很少有人详细的说明它是如何工作(实现)的,这里,我打算用一小段简单的代码,模拟boost.bind

will_hsbsch的专栏 2970

Boostboost中function和bind一起使用的技巧(二)

Boost.Function 一起使用 Boost.Bind   当我们把 Boost.Function 与某个支持参数绑定的结合起来使用时,事情变得更为有趣。Boost.Bind 为普通函数、成员函数以及成员变量提供参数绑定。这非常适合于 Boost.Function, 我们常常需要这类绑定,由于我们使用的类本身并不是函数对象。那么,我们用 Boost.Bind 把它们转变为函数

liujiayu2的专栏 1884

BOOST C++ 12 函数式编程】(1)Boost.Phoenix

在函数式编程模型中,函数是对象,与其他对象一样,可以作为参数传递给函数或存储在容器中。本节介绍支持函数式编程模型的 Boost

gongdiwudu的专栏 5195

boost.bind介绍与实例

boost.bind顾名思义就是用来将函数按照特定的接口规范将已经有的但是接口不一致的函数转化成规定的接口的一种Adaptor技术,是Adaptor模式的一种具体实现.我最早是在STD当中看到的 。int f(string str1,string str2){  cout"f("+str1+","+str2+")"endl;  return 0;}使用boost.bind可以将f函

619

使用Boostbind绑定函数:解决问题的测试程序

在C++编程中,有时候我们需要将一个函数作为参数传递给另一个函数,或者在调用函数时绑定一些参数。Boost提供了一个非常有用的组件——bind,它可以帮助我们实现函数绑定和参数传递的需求。通过使用Boostbind,我们可以轻松地实现函数绑定和参数传递的需求。无论是将参数绑定到函数上,还是将函数绑定到其他函数上,bind都提供了简洁而强大的解决方案。除了将某些参数绑定到函数上,我们还可以将函数绑定到其他函数上。现在,我们将使用bind函数来创建一个新的可调用对象,它将调用。等来表示后续的参数。

PixelLoom的博客 192

使用Boost中的bind函数进行__cdecl测试

通过使用bind函数,我们可以轻松地创建可调用对象,并将函数指针与参数绑定在一起。在本文中,我们将使用Boost中的bind函数来测试__cdecl函数调用约定。在main函数中,我们使用Boost中的bind函数来创建了一个可调用对象bindFunc。bind函数的第一个参数是需要绑定的函数指针,后面的参数是占位符。在本示例中,我们使用_1和_2作为占位符,表示参数的位置。在上面的代码中,我们定义了一个名为myFunction的函数,其函数签名为__cdecl,接受两个整型参数。

2301_79331230的博客 137

Boost:使用bind绑定进行回归测试

在回归测试中,我们可以使用 bind 将被测试函数和预期结果组合成一个新的可调用对象,然后通过比较执行结果和预期结果来判断测试是否通过。我们将 f 和预期结果 3 一起传给 test 函数,bind 函数会在执行时自动计算 foo(1, 2) 的结果,并将结果与预期结果比较。这样的测试函数很简单,但如果我们的代码发生变更,我们需要手动修改所有的测试函数来适应新的实现。这就是回归测试的痛点所在:如果我们的代码非常大,那么测试函数的数量可能会非常庞大,手动修改它们会非常麻烦。

CoderExtra的博客 164
上一篇: Visual Studio代码字体
下一篇: 本人遇到的常见g++编译链接错误总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值