利用std::bind和std::function实现对象间通信

本文介绍如何使用C++11的std::bind和std::function来实现同一类不同对象间的委托调用,通过示例代码展示如何绑定成员函数到事件对象,从而实现对象间的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用std::bind和std::function实现对象间通信

C++11中利用bind和function,同一个类的不同对象可以委托给不同的实现,从而实现不同的行为。

示例代码如下:

class Widget
{
public:
	Widget()
	{		
		//event_widgetCreated();
	}
	~Widget()
	{
		if (event_widgetDestroyed)
		{
			(*event_widgetDestroyed)();
 
			delete event_widgetDestroyed;
			event_widgetDestroyed = nullptr;
		}
	}
 
	void sendMessage(int msgID)
	{
		if (event_sendMessageId) 
			event_sendMessageId(msgID);
	}
	void sendMessage(std::string msg)
	{
		if (event_sendMessageText)
			event_sendMessageText(msg);
	}
 
public:
	//定义事件对象供外部使用
	std::function<void()> 				event_widgetCreated;
	std::function<void()>* 				event_widgetDestroyed;
	std::function<void(int)> 			event_sendMessageId;
	std::function<void(std::string)> 	event_sendMessageText;
};
 
using namespace std::placeholders;
class JobDeal
{
public:
	JobDeal()
	{		
	}	
	
	void widgetDestoryed()
	{
		std::cout << "widgetDestoryed" << std::endl;
	}
 
	void sendMessage(int msgID)
	{
		std::cout << "sendMessage: " << msgID << std::endl;
	}
 
	void sendMessage(std::string msg)
	{
		std::cout << "sendMessage: " << msg << std::endl;
	}
};
 
//测试函数 同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为
void test_bind_func()
{
	Widget w;
	JobDeal jobDeal;
	
	w.event_sendMessageId = std::bind((void(JobDeal::*)(int))&JobDeal::sendMessage, &jobDeal, _1);
	w.event_sendMessageText = std::bind((void(JobDeal::*)(std::string))&JobDeal::sendMessage, &jobDeal, _1);
	w.event_widgetDestroyed = new std::function<void()>(std::bind(&JobDeal::widgetDestoryed, &jobDeal));
 
	w.sendMessage(123);
	w.sendMessage("abc");
}

或者是

//或
using namespace std::placeholders;
class JobDeal
{
public:
	JobDeal()
	{
 
	}
 
	//同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为
	void test_bind_func()
	{
		Widget w;
 
		w.event_sendMessageId = std::bind((void(JobDeal::*)(int))&JobDeal::sendMessage, this, _1);
		w.event_sendMessageText = std::bind((void(JobDeal::*)(std::string))&JobDeal::sendMessage, this, _1);
		w.event_widgetDestroyed = new std::function<void()>(std::bind(&JobDeal::widgetDestoryed, this));
 
		w.sendMessage(123);
		w.sendMessage("abc");
	}
 
private:
	void widgetDestoryed()
	{
		std::cout << "widgetDestoryed" << std::endl;
	}
 
	void sendMessage(int msgID)
	{
		std::cout << "sendMessage: " << msgID << std::endl;
	}
 
	void sendMessage(std::string msg)
	{
		std::cout << "sendMessage: " << msg << std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	JobDeal jobDeal;
	jobDeal.test_bind_func();
 
	std::cout << std::endl;
	system("pause");
}

和C#中的委托十分类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值