求教switch case替代方案

狼异族 2020-10-28 04:53:05
服务端,负责处理客户端请求,不同的请求类型对应不同的请求函数,目前已经有上百个类型了, 感觉些switch case 有点繁琐,想替换成function map,但是测试下了,function map的效率比switch case低太多了,后面想换成 function 数组,用请求类型做下标,但是请求类型又不是连续的, 不知道怎么在运行前初始化这个数组,各位大佬还有什么办法?
...全文
490 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
狐狸小十 2020-11-18
  • 打赏
  • 举报
回复
主要慢在查询上,除非自己写个表,std::function也不快,换成函数指针 即使你抛弃所有现成工具,完全自己折腾一圈 最后也会发现和switch差不多,现在编译器处理也是用类似索引的方式 想提高效率还得在批处理方面看看 要是单纯嫌代码乱的话完全没必要
狼异族 2020-11-01
  • 打赏
  • 举报
回复
引用 15 楼 狼异族 的回复:
引用 14 楼 真相重于对错 的回复:
win32 gui 程序他也是要处理几百个消息,建议借鉴一下 mfc和wtl的处理方式
wtl 我没看过, 但是MFC最底层的CWnd是用循环查找消息的
	while (lpEntry->nSig != AfxSig_end)
	{
		if (lpEntry->nMessage == nMsg && lpEntry->nCode == nCode &&
			nID >= lpEntry->nID && nID <= lpEntry->nLastID)
		{
			return lpEntry;
		}
		lpEntry++;
	}
	return NULL;    // not found
狼异族 2020-11-01
  • 打赏
  • 举报
回复
引用 14 楼 真相重于对错 的回复:
win32 gui 程序他也是要处理几百个消息,建议借鉴一下 mfc和wtl的处理方式
wtl 我没看过, 但是MFC最底层的CWnd是用循环查找消息的
真相重于对错 2020-10-31
  • 打赏
  • 举报
回复
引用 13 楼 狼异族 的回复:
引用 8 楼 真相重于对错 的回复:
多态才不麻烦了,正是由于你有几百种类型,使用多态才适合
我怎么才能把请求类型和继承类关联起来呢?
win32 gui 程序他也是要处理几百个消息,建议借鉴一下 mfc和wtl的处理方式
真相重于对错 2020-10-30
  • 打赏
  • 举报
回复
如果有上百个类型,去手工构造这个表,是不是自讨苦吃啊
真相重于对错 2020-10-30
  • 打赏
  • 举报
回复
不管使用什么表也好,map也好。 都要手工来构造的这个容器,而多态编译器会自动给建造它
狼异族 2020-10-30
  • 打赏
  • 举报
回复
引用 8 楼 真相重于对错 的回复:
多态才不麻烦了,正是由于你有几百种类型,使用多态才适合
我怎么才能把请求类型和继承类关联起来呢?
uouo88 2020-10-29
  • 打赏
  • 举报
回复
楼主可以使用unordered_map来代替,有几个好处: 1.首先内部使用的是哈希表散列算法,速度绝对的快 2.可以实现数组的访问方式,同时突破数组的限制:数组的下标必须是数字,而unordered_map的key可以是字符串或者很复杂的对象。 3.初始化和使用方式和C++数组类似,且添加元素非常方便,说明如下: 针对你的需求,你可以让类型作为key,而让函数的指针来作为value,以下面这种方式来添加或使用 unordered_map<keyType,valueType> funArr; funArr[key] = value; //数组形式插入,如果容器中没有这个key,则会新增这个key和value,如果有,则会更新他的值
自信男孩 2020-10-29
  • 打赏
  • 举报
回复
可不可以定义函数指针数组,把类型定义成数组的下表,当然下表和函数需要一一对应起来,供参考~
赵4老师 2020-10-29
  • 打赏
  • 举报
回复
switch case编译器已经优化的很好了。
真相重于对错 2020-10-29
  • 打赏
  • 举报
回复
class Base{ public: virtual func()=0; } class ch1:Base{ public: func(){} }; class ch2:Base{ .... } vector<Base*> list; for(auto o:list) { o->func(); }
真相重于对错 2020-10-29
  • 打赏
  • 举报
回复
多态才不麻烦了,正是由于你有几百种类型,使用多态才适合
Minikinfish 2020-10-29
  • 打赏
  • 举报
回复
引用 2 楼 赵4老师 的回复:
switch case编译器已经优化的很好了。
测试过,switch case 比 if --- else if ---都快。。。为啥要换 如果协议太多,可以自己写工具,自动化生成协议代码。
狼异族 2020-10-29
  • 打赏
  • 举报
回复
引用 3 楼 自信男孩 的回复:
可不可以定义函数指针数组,把类型定义成数组的下表,当然下表和函数需要一一对应起来,供参考~
我目前就是这么处理的,不过又新弄了一个静态成员类去初始化这个数组,比较别扭
狼异族 2020-10-29
  • 打赏
  • 举报
回复
引用 4 楼 真相重于对错 的回复:
直接利用多态啊
多态就太麻烦了
真相重于对错 2020-10-29
  • 打赏
  • 举报
回复
直接利用多态啊
SleekStone 2020-10-28
  • 打赏
  • 举报
回复
把function map 换成function hash

65,187

社区成员

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

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