这种情况如何消除几百个 if/else

283 天前
 aqtata

运行时从外部读取一个 16 进制数字,然后调用对应的函数,比如读取到1F3,那么就调用函数foo_1f3,函数参数也是有编号的,规律是这样:

void foo_1f0(myclass_1f0& val);
void foo_1f1(myclass_1f1& val);
void foo_1f2(myclass_1f2& val);

之前 C#是用的反射,很容易实现。到 C++这不知道怎么搞比较优雅,目前有上百个 if/else 去判断然后调用。

C++这边可以用到 C++20 ,不知道有什么酷的解决方法?

9355 次点击
所在节点    C++
63 条回复
HtPM
283 天前
宏定义
qq135449773
283 天前
这种需求本来难以简化的,Map<key, func>已经是不错的选择了。

再想继续想办法简化我觉得只能增加后期维护负担。
nuk
283 天前
符号得和得和字符串对上,简单点就是 dlsym ,复杂一点用 linker set ,自己加 map 也可以,就是没那么优雅了。
DLOG
283 天前
请问 您是找 “宏” 的使用方法么
itechify
283 天前
反射有没有?
shadowyue
283 天前
只是平级的 if else 没必要专门消除吧,看起来也是很清晰的。
你要 if else 嵌套很多层,去消除更有意义一点。
defaw
283 天前
用 map ,key 是数字,value 是函数指针,直接写死在 map 的初始化里
gam2046
283 天前
@DLOG #24 大佬,求明示,宏如何解决楼主的问题。能给个简单的样例嘛。
xing7673
283 天前
@leonshaw 用宏包最满足要求
ftfunjth
283 天前
levelworm
283 天前
函数指针数组就行了。直接写死。然后直接调用数组成员。
sampeng
283 天前
查表法简单优雅。比冲击波墙吧。。。
seanwhy
283 天前
c++有个 rttr 的反射开源库,github 上可以搜下
exonuclease
283 天前
代码生成?
jcharr
283 天前
```c
jcharr
283 天前
```c
#define GET_HEX_REGITER(HEX) \
static __always_inline void ctx_##HEX(myclass_1##HEX& val) { \
/*todo*/ \
}

GET_HEX_REGITER(a)
```
这是用宏来写的 感觉应该能满足吧 能不用映射就不用映射
min
283 天前
这个问题你找不到大模型可以问吗?
netabare
283 天前
用表驱动和高阶函数会比较好
nicebird
283 天前
宏定义吧
nicebird
283 天前
另外现在直接用 copilot 生成就行了,也不用写啥代码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1105424

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX