利用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#中的委托十分类似。