游戏服务器代码中有时候有很多相似的函数调用,为了简化函数的操作与管理,也为了后续的扩展,常常采用"注册"的方式。例如对于召集类函数的管理,有队伍召集,各种活动召集,家族召集等,如果有新的召集类型,只需要注册一下新类型就可以了。
enum CallType{
CALLUP_TEST_1 = 1,
CALLUP_TEST_2 = 2,
CALLUP_TEST_3 = 3,
...
};
#define reg_callup(type) \
_callup_func[type] = bind(&CallupMgr::on_##type, this, _1, _2)
class CallupMgr : public Singleton<CallupMgr>
{
public:
typedef function<bool (..., ..)> Function;
bool call_by_type(..., int type);
void init()
{
reg_callup(CALLUP_TEST_1);
reg_callup(CALLUP_TEST_2);
reg_callup(CALLUP_TEST_3);
...
}
bool on_CALLUP_TEST_1(..., ...);
bool on_CALLUP_TEST_2(..., ...);
bool on_CALLUP_TEST_3(..., ...);
private:
map<int, Function> _callup_func;//类型,相应的处理函数
};
在call_by_type函数中,可以根据type找到需要调用的处理函数。但需要添加新的召集类型是,只需要添加一个枚举类型,并且注册相应的类型,然后添加一下对应的处理函数就可以了。