###类内函数回调利用function模板和std::bind实现类似函数指针的功能,但其比函数指针更加灵活,特别是处理一些类的非静态成员函数时,function模板可以绑定到全局函数或类的静态成员函数,如果要绑定类的非静态成员函数,则需要使用std::bind。
#include "stdafx.h"
#include <Windows.h>
#include <process.h>
#include <functional>
#include <iostream>
#include <time.h>
using namespace std;
typedef std::function<void (int index)> NotifyFun;
class CMgr
{
public:
CMgr()
{
}
~CMgr()
{
}
void StdCall(int x)
{
if (m_pFunc)
{
m_pFunc(x);
}
}
void SetCallbcak(NotifyFun pFunc)
{
m_pFunc = pFunc;
}
private:
NotifyFun m_pFunc;
};
class CUser
{
public:
CUser(CMgr* pMgr)
: m_pMgr(pMgr)
{
}
~CUser()
{
}
void SetFunc()
{
NotifyFun func = std::bind(&CUser::MyFunc, this, std::placeholders::_1);
m_pMgr->SetCallbcak(func);
}
void MyFunc(int x)
{
cout<<"CUser::MyFunc:"<<x<<endl;
}
private:
CMgr* m_pMgr;
};
unsigned int _stdcall ThreadProc(void* param)
{
int countIndex = 0;
CMgr* pMgr = (CMgr*)param;
srand(time(NULL));
while (true)
{
countIndex++;
if (countIndex > 10)
{
break;
}
int x = rand();
pMgr->StdCall(x);
Sleep(1 * 1000);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
CMgr* pMgr = new CMgr;
CUser user(pMgr);
user.SetFunc();
HANDLE hThread;
unsigned int threadId;
hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, pMgr, 0, &threadId);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
system("pause");
return 0;
}
本文由 Ryan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2017/11/15 09:07