使用boost的函数库实现通用switch-case/if..else选择器

AWolfBoy 2007-04-20 11:20:41
在通信行业做事久了,经常发现在写的程序中,大量重复出现if..else..这种嵌套层次相当深的switch写法,所以就蒙生了自己写一个通用switcher的想法,把这种强耦合的写法隔离,所以就用了下面的实现

/*********************************************
* 通用选择器
* 1. 适配原始函数指针
* 2. 适配成员函数指针
* 3. 适配仿函数
* 4. 绑定函数
********************************************/
template<typename RESULT,
typename KEY,
typename PARA>
class switcher
{
private:
typedef boost::function<RESULT, PARA> FUNCTOR;
public:
void add_observer(KEY key, FUNCTOR func)
{
functorset.insert(make_pair(key, func));
}

RESULT match(KEY key, PARA para)
{
map<KEY, FUNCTOR>::const_iterator iter;
iter = functorset.find(key);
if (iter != functorset.end())
{
static_cast<FUNCTOR>(iter->second)(para);
}
}
private:
map<KEY, FUNCTOR> functorset;
};

bool some_function(const std::string& s)
{
std::cout << s << " This is really neat\n";
return true;
}

class some_class
{
public:
bool some_function(const std::string& s)
{
std::cout << s << " This is also quite nice\n";
return true;
}
};
class some_function_object
{
public:
bool operator()(const std::string& s)
{
std::cout << s <<
" This should work, too, in a flexible solution\n";
return true;
}
};

switcher<bool, int, string> myswitcher;

bool test(int number, string info)
{
return myswitcher.match(number, info);
}

int main(int argv, char** argc)
{
function1<bool,const std::string&> f1(&some_function);
function1<bool,const std::string&> f2(&some_class::some_function,&s);
function1<bool,const std::string&> f3(boost::bind(&some_class::some_function,&s,_1));
some_function_object fso;
function1<bool,const std::string&> f4(fso);
myswitcher.add_observer(0, f1);
myswitcher.add_observer(1, f2);
myswitcher.add_observer(2, f3);
myswitcher.add_observer(3, f4);
test(0, "call by f1");
}

文章还有不足之处,敬请大家指教,希望能和喜欢Boost库的朋友做做交流
...全文
987 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oversense 2007-04-28
  • 打赏
  • 举报
回复
boost::function 去不去各有各的好处
不去,可以把实现写在cpp里面

//hpp
void foo(boost::function x);
//cpp
void foo(boost::function x){
}
taodm 2007-04-24
  • 打赏
  • 举报
回复
作为一个通用库的实现者,你不能假设用户需不需要支持异质functor,所以,functor的类型应该由用户作为模板参数传入,就如同我前面的代码,用户自己typedef任何东西为PROCESSOR。
相应地,你的add_observer接口应该把function去掉。
taodm 2007-04-24
  • 打赏
  • 举报
回复
那先把function从代码里去掉嘛。
AWolfBoy 2007-04-24
  • 打赏
  • 举报
回复
老兄,好好看看tuple,再看看我上面说的话吧。就知道什么意思啦

那既然做不到我所说的那些,你有啥优势可言?我如果不需要适配多种异质参数,我也可以不用function,那何来强烈侵入性?
taodm 2007-04-24
  • 打赏
  • 举报
回复
我那段代码只是省略了你的传参过程。而复杂度也全部就在这个传参上了。
用户如果需要同时封装异质指针,那他必须使用function,如果他只需要同质指针,他就不需要知道function。这正是强弱侵入性的区别。

当然可以不使用assign库,只不过要用和你现在相同的那些一行又一行的add_observer/insert调用。

不用tuple,那么传多个参数怎么实现?让用户就为了传参来封装一个纯数据结构?那不还是tuple嘛。且不说把不同来源、含义的数据强封转入结构已经是《重构》所说的坏味道之一了。
AWolfBoy 2007-04-24
  • 打赏
  • 举报
回复
你现在的设计,要求用户差不多同时要掌握function、lambda、tuple。

真的需要吗?顶多也就是要求用户知道function的用法吧,不信你再看看上面所说的每一句
AWolfBoy 2007-04-24
  • 打赏
  • 举报
回复
能吗?!
你同时适配一个原始指针和一个其他类型的指针我看看
你的所谓设计是不是也有个前提要求用户必须会用Boost的分配库?
至于其他的我就不说了
taodm 2007-04-24
  • 打赏
  • 举报
回复
所以,如果自己用来掌握boost,很好;如果在项目组推广,太复杂了,不建议使用。
taodm 2007-04-24
  • 打赏
  • 举报
回复
第三,能不能实现为非侵入性?
能,基本上照抄一遍fuction的源码。所以,太复杂了。
taodm 2007-04-24
  • 打赏
  • 举报
回复
第二点,什么是强侵入性设计。
强侵入性设计是指对使用者有很多要求,即使很多功能用户不需要使用也无法裁减和替代。
MFC已经被认为是强侵入性设计的典范,而ACE则是非侵入性设计的典范。
你现在的设计,要求用户差不多同时要掌握function、lambda、tuple。
如果不是因为要使用你这个设计,会有多少情况需要同时使用这么多比较高阶的东西。
而且,按你现在的设计,即使functor不需要参数,也得给个哑参。
taodm 2007-04-24
  • 打赏
  • 举报
回复
我上面的代码哪一点做不到了?
FingerStyle 2007-04-24
  • 打赏
  • 举报
回复
此帖收藏。。。

向楼上的牛人们学习。。。

弱弱的问一下, 楼上的牛牛们工作几年了 ??? 学习.....
AWolfBoy 2007-04-24
  • 打赏
  • 举报
回复
既然楼上这么说,那就把你那代码也实现成我这样,能适配任意指针,有返回指,处理多参数,效率高,可以有回传参数,先完成了这些功能咱们再来说优势
taodm 2007-04-23
  • 打赏
  • 举报
回复
那么,一点点来。
和我写的不封装的代码比,你的代码有什么优势?
如果没有的话,那么根据剃刀理论:若无其需,莫增其事。
taodm 2007-04-23
  • 打赏
  • 举报
回复
给分是对提供了有价值信息的人的一个尊重。
AWolfBoy 2007-04-23
  • 打赏
  • 举报
回复
鉴于CSDN上朋友们的习惯,特此加100分,希望得到大家的讨论。分还可以再加
AWolfBoy 2007-04-23
  • 打赏
  • 举报
回复
算了,不说那么多啦,CSDN是一个做为技术交流的平台,不是来吵架的。
我也不希望有谁来拍马屁, 还有我还真没想到大家原来是冲着分才进来的,如果这样的话我可以把分提高了。
taodm 2007-04-23
  • 打赏
  • 举报
回复
想听拍马屁的话何必到csdn,在公司找几个新人,高帽子足可压死人了。
挑刺才能使你进步。
对于0分贴,有2、3人进来挑刺,也很算你有面子了。
AWolfBoy 2007-04-23
  • 打赏
  • 举报
回复
我看还是不用了,楼上的朋友们都是来挑刺的,不是来交流讨论的。我等菜鸟就不敢打扰各位高手啦
taodm 2007-04-22
  • 打赏
  • 举报
回复
不知道的东西可以google嘛。
加载更多回复(34)

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧