代码
#include <iostream>
#include <list>
using namespace std;
struct CallbackBase { virtual void operator()(const char* msg,int len) = 0; };
void messagesCB(const char* msg,int len)
{
std::cout<<msg<<" "<<len<<std::endl;
}
struct MessagesWatcher
{
void update(const char* msg,int len)
{
for(auto& cb:m_lst){
(*cb)(msg,len);
}
}
void add(CallbackBase* cb)
{
m_lst.push_back(cb);
}
public:
std::list<CallbackBase*> m_lst;
};
MessagesWatcher watcher;
template<class Callable>
void dispatch(Callable callable)
{
struct _Callback : public CallbackBase {
Callable callable;
_Callback(Callable& cb) : callable(cb) { }
void operator()(const char* msg,int len) { callable(msg,len); }
};
_Callback* callback = new _Callback(callable);
watcher.add(callback);
}
int main()
{
dispatch(messagesCB);
std::string lambdas{"lambdas"};
dispatch([lambdas](const char* msg,int len){
std::cout<<lambdas<<" "<<msg<<" "<<len<<std::endl;
});
watcher.update("hello",5);
return 0;
}
说明
支持lambda
std::string lambda{"lambda"};
dispatch([lambdas](const char* msg,int len){
std::cout<<lambdas<<" "<<msg<<" "<<len<<std::endl;
});