65,206
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string>
#include <map>
using namespace std;
template<class TKey, class TCallBack>
class CCallBackBase
{
public:
typedef typename std::map<TKey, TCallBack> MapCallBack;
typedef typename std::map<TKey, TCallBack>::iterator MapCallBackIt;
virtual bool Init()
{
return true;
}
bool Register(TKey _1, TCallBack _2)
{
MapCallBackIt It = m_mapCallBacks.find(_1);
if (It != m_mapCallBacks.end())
{
return false;
}
m_mapCallBacks[_1] = _2;
return true;
}
TCallBack FindCallBack(TKey _1)
{
MapCallBackIt It = m_mapCallBacks.find(_1);
if (It == m_mapCallBacks.end())
{
return NULL;
}
return It->second;
}
private:
MapCallBack m_mapCallBacks;
};
typedef int (*CallBack)(const std::string &strBuf);
class CCallBackHandler : public CCallBackBase<std::string, CallBack>
{
public:
CCallBackHandler()
{
Init();
}
virtual bool Init()
{
if (Register("Test1", &CCallBackHandler::OnTest1)
&& Register("Test2", &CCallBackHandler::OnTest2))
{
return true;
}
assert(0);
return false;
}
void Call(const std::string &strKey, const std::string &strBuf)
{
CallBack pCallBack = FindCallBack(strKey);
if (NULL != pCallBack)
{
(*pCallBack)(strBuf);
}
}
static int OnTest1(const std::string &strBuf)
{
cout << strBuf << endl;
return 0;
}
static int OnTest2(const std::string &strBuf)
{
cout << strBuf << endl;
return 0;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CCallBackHandler oCallBackHandler;
oCallBackHandler.Call("Test1", "测试 调用OnTest1");
oCallBackHandler.Call("Test2", "测试 调用OnTest2");
return 0;
}
typedef int(*Func)(int,int);
int add(int, int);
int sub(int, int);
#define BEGIN_FUN_MAP(thecls)\
Func thecls::getFuncName(char *szFunName)\
{\
#define FUN_EVENT(str, fun)\
if ( !strcmp(str, "add") )\
return fun;
#define END_FUN_MAP()\
return NULL;
}
// 用法
class FunObj
{
public:
BEGIN_FUN_MAP(FunObj)
FUN_EVENT("add", add)
FUN_EVENT("sub", sub)
END_FUN_MAP()
}