工作中需要根据不同类型来调用不同函数接口时,通常使用switch case来实现
switch(itemType)
{
case ...;
case ...;
.
.
.
}
不断的添加新的需求会导致case分支很多,
使用boost库解决方案:
typedef boost::function<void(long, int)> TypeOnUseItemHandler; // 回调函数返回void 参数一个是long long型,一个是int型
map<int, TypeOnUseItemHandler> _handlers; // 定义map<key, value> key是case的条件 value是执行的接口
_handlers[ItemSpecialAttrId::TimeOfDuration] = boost::bind(&ItemManager::UseTimeOfDuration, this, boost::lambda::_1, boost::lambda::_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);
map<int, TypeOnUseItemHandler>::iterator itFind = _handlers.find(specialAttrId);//switch 中的判断分支条件
if (itFind == _handlers.end())
return;
if (itFind->second)
{
TypeOnUseItemHandler = itFind->second(roleId, specialAttrValue);
TypeOnUseItemHandler(10.000,10);
}
这样写 通过注册的方式来调用不同的函数接口,方便,灵活, 如果有新增的case情况 直接填写一个:
_handlers[ItemSpecialAttrId::GainReinforceProp] = boost::bind(&ItemManager::UseGainReinforceProp, this, _1, _2);
_handlers[ItemSpecialAttrId::GainReinforceProp] = boost::bind(&ItemManager::UseGainReinforceProp, this, _1, _2);