boost::function 用来注册函数(switch N多case的解决方案) (一)

2014-11-24 03:28:18 · 作者: · 浏览: 0

[cpp]
在现在做的游戏开发的项目中,需要根据道具类型调用不同的接口,通常的写法是用

在现在做的游戏开发的项目中,需要根据道具类型调用不同的接口,通常的写法是用[cpp] view plaincopyprint
switch(itemType)
{
case ...;
case ...;
.
.
.
}

switch(itemType)
{
case ...;
case ...;
.
.
.
}这样写的话,如果将来有新增情况会导致case越来越多 ,不好。


正好项目中使用了boost库,结果老大给了个解决方案:

[cpp]
typedef boost::function TypeOnUseItemHandler; // 回调函数返回void 参数一个是long long型,一个是int型
map _handlers; // 定义map key是case的条件 value是执行的接口

typedef boost::function TypeOnUseItemHandler; // 回调函数返回void 参数一个是long long型,一个是int型
map _handlers; // 定义map key是case的条件 value是执行的接口[cpp] view plaincopyprint
// 注册
_handlers[ItemSpecialAttrId::TimeOfDuration] = boost::bind(&ItemManager::UseTimeOfDuration, this, _1, _2);
_handlers[ItemSpecialAttrId::StorgeHpVolume] = boost::bind(&ItemManager::UseStorgeHpVolume, this, _1, _2);
_handlers[ItemSpecialAttrId::IsGetItem] = boost::bind(&ItemManager::UseIsGetItem, this, _1, _2);
_handlers[ItemSpecialAttrId::ItemBuff] = boost::bind(&ItemManager::UseItemBuff, this, _1, _2);
_handlers[ItemSpecialAttrId::Bind] = boost::bind(&ItemManager::UseBind, this, _1, _2);
_handlers[ItemSpecialAttrId::ReinforceLevel] = boost::bind(&ItemManager::UseReinforceLevel, this, _1, _2);
_handlers[ItemSpecialAttrId::AddPartnerExp] = boost::bind(&ItemManager::UseAddPartnerExp, this, _1, _2);
_handlers[ItemSpecialAttrId::AddRoleExp] = boost::bind(&ItemManager::UseAddRoleExp, this, _1, _2);
_handlers[ItemSpecialAttrId::AddSliver] = boost::bind(&ItemManager::UseAddSliver, this, _1, _2);
_handlers[ItemSpecialAttrId::AddGold] = boost::bind(&ItemManager::UseAddGold, this, _1, _2);
_handlers[ItemSpecialAttrId::AddGoldNote] = boost::bind(&ItemManager::UseAddGoldNote, this, _1, _2);
_handlers[ItemSpecialAttrId::SynthMaterial] = boost::bind(&ItemManager::UseSynthMaterial, this, _1, _2);
_handlers[ItemSpecialAttrId::EnhanceNpcExp] = boost::bind(&ItemManager::UseEnhanceNpcExp, this, _1, _2);
_handlers[ItemSpecialAttrId::GetAttribute] = boost::bind(&ItemManager::UseGetAttribute, this, _1, _2);
_handlers[ItemSpecialAttrId::GainReinforceProp] = boost::bind(&ItemManager::UseGainReinforceProp, this, _1, _2);

// 注册
_handlers[ItemSpecialAttrId::TimeOfDuration] = boost::bind(&ItemManager::UseTimeOfDuration, this, _1, _2);
_handlers[ItemSpecialAttrId::StorgeHpVolume] = boost::bind(&ItemManager::UseStorgeHpVolume, this, _1, _2);
_handlers[ItemSpecialAttrId::IsGetItem] = boost::bind(&ItemManager::UseIsGetItem, this, _1, _2);
_handlers[ItemSpecialAttrId::ItemBuff] = boost::bind(&ItemManager::UseItemBuff, this, _1, _2);
_handlers[ItemSpecialAttrId::Bind] = boost::bind(&ItemManager::UseBind, this, _1, _2);
_handlers[ItemSpecialAttrId::ReinforceLevel] = boost::bind(&ItemManager::UseReinforceLevel, this, _1, _2);
_handlers[ItemSpecialAttrId::AddPartnerExp] = boost::bind(&ItemManager::UseAddPartnerExp, this, _1, _2);
_handlers[ItemSpecialAttrId::AddRoleExp] = boost::bind(&ItemManager::UseAddRoleExp, this, _1, _2);
_handlers[ItemSpecialAttrId::AddSliver] = boost::bind(&ItemManager::UseAddSliver, this, _1, _2)