C++回调机制浅学
参考文档:https://www.jianshu.com/p/4f907bba6d5f
//1、面向过程的回调call_back
#include <iostream>
typedef void(__stdcall *DownloadCallback)(const char *pURL, bool OK);
void DownLoadFile(const char *pURL, DownloadCallback callback)
{
std::cout << "downloading..." << pURL << "" << std::endl;
callback(pURL, true);
}
void __stdcall onDownloadFinished(const char* pURL, bool bOK)
{
std::cout << "onDownloadFinished..." << pURL << " status:" << bOK << std::endl;
}
int main()
{
int i = 1;
DownLoadFile("http://wwww.baidu.com", onDownloadFinished);
system("pause");
return 0;
}
//2、sink方式,面向对象的回调,通过类继承和virtual机制实现
#include <iostream>
class IDownloadSink
{
public:
virtual void OnDownloadFinished(const char *pURL, bool bOK) = 0;
};
class CMyDownloader
{
public:
CMyDownloader(IDownloadSink *pSink)
:m_pSink(pSink)
{
std::cout << "111" << std::endl;
std::cout << "222" << std::endl;
std::cout << "333" << std::endl;
}
void DownloadFile(const char* pURL)
{
std::cout << "downloading..." << pURL << "" << std::endl;
if (m_pSink != NULL)
{
m_pSink->OnDownloadFinished(pURL, true);
}
}
private:
IDownloadSink *m_pSink;
};
class CMyFile :public IDownloadSink
{
public:
void download()
{
CMyDownloader downloader(this);
downloader.DownloadFile("www.baidu.com");
}
virtual void OnDownloadFinished(const char *pURL, bool bOK)
{
std::cout << "onDownloadFinished..." << pURL << " status:" << bOK << std::endl;
}
};
int main()
{
CMyFile *file = new CMyFile();
file->download();
system("pause");
return 0;
}
//3、小粒度的回调C++11用std::funciton已经支持的很好了, 而且对传入的回调函数的形式都能进行自定义, 方便进行模板编程, 如下面的例子
#include <functional>
#include <iostream>
class Callback
{
public:
void Call(int i) { std::cout << i << std::endl; }
};
class Client
{
public:
void Trigger(std::function<void()> Call)
{
Call();
}
};
int main()
{
Callback callback;
Client client;
int i;
client.Trigger(std::bind(&Callback::Call, &callback, i); //print i
return 0;
}
//4、函数指针回调
#include <iostream>
class callback
{
public:
callback();
~callback();
void docallback(void (*p)());
private:
};
callback::callback()
{
}
callback::~callback()
{
}
void callback::docallback(void(*p)())
{
// 内部实现
std::cout << "inner" << std::endl;
(*p)();
}
int main()
{
// 外部的实现
void (*p)() = []()->void{
std::cout << "outter" << std::endl;
};
callback *p_call_back = new callback();
p_call_back->docallback(p);
delete p_call_back;
return 0;
}
//5、类 指针 回调?
#include <iostream>
class Client;
class Callback
{
public:
Callback();
~Callback();
void DoCallBack(Client *p_client, void (Client::*p_func)());
private:
};
Callback::Callback()
{
}
Callback::~Callback()
{
}
class Client
{
public:
Client();
~Client();
void doSomething();
private:
};
Client::Client()
{
}
Client::~Client()
{
}
void Client::doSomething()
{
std::cout << "Client" << std::endl;
}
void Callback::DoCallBack(Client *p_client, void (Client::*p_func)())
{
std::cout << "Callback" << std::endl;
(p_client->*p_func)();
}
int main()
{
Callback *p_call_back = new Callback();
Client *p_client = new Client();
void (Client::*p_func)() = &Client::doSomething;
p_call_back->DoCallBack(p_client, p_func);
delete p_call_back;
delete p_client;
return 0;
}