请问 C++中对函数指针的序列化存储有没有好的建议?

2020-11-01 10:49:54 +08:00
 1YsX1

目前有这样的一个需求,处理起来小有迷茫,希望有大佬能够进行指点。

我用工厂模式构造了一个通过字符串来返回具体子类的基类函数,字符串与子类的 Create 方法使用 std::map 进行存储,这样在程序运行时是可以通过字符串来动态的获取到不同的子类实体的。

但是我现在希望将这些动态关系进行序列保存,直接使用 boost 的序列化库的话是会有如下报错的

cannot convert ‘t’ (type ‘parser::parser* (*)()’) to type ‘const void*’

看起来 boost 库的序列化是不支持函数指针的序列化的,同时我也在考虑每次重新运行或者换了机器运行时函数指针是不是也会发生变化。所以感觉这个方案不太靠谱。目前从网上进行了搜索,也没有找到合适的方案,希望能有前辈指点一下方向,谢谢!

2772 次点击
所在节点    C++
10 条回复
feelapi
2020-11-01 12:11:51 +08:00
为什么要保存函数指针?函数名不好么?动态加载不就可以了。
tairan2006
2020-11-01 12:15:17 +08:00
啥玩意,你要序列化函数指针干啥?反射听过没
tairan2006
2020-11-01 12:15:55 +08:00
当然 C++不支持反射,但是思想类似
hitmanx
2020-11-01 13:00:23 +08:00
dlsym
1YsX1
2020-11-01 14:25:22 +08:00
@feelapi
@tairan2006
@hitmanx
谢谢几位大佬指路!
xuanbg
2020-11-01 14:35:56 +08:00
想不通序列化指针有啥用?
msg7086
2020-11-01 17:13:25 +08:00
指针当然会变啊。
hacher
2020-11-01 18:38:43 +08:00
函数指针本质是内存地址, 不知道你运行环境是什么, 在 windows 下函数地址和程序基址的偏移是固定的: diff = &function - GetModuleHandle(nullptr)
你保存 diff, 下次运行时加上程序基址就是函数地址了: function = diff + GetModuleHandle(nullptr)
要注意的是这个偏移每次编译后都会变化的~
togou
2020-11-02 12:25:09 +08:00
函数指针算数据么? 一般来说就数据或者数据结构需要序列化
newmlp
2020-11-07 15:42:26 +08:00
函数指针当然每次程序运行的时候不一样,保存函数指针没啥意义吧,保存函数名还是可以的

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

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

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

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

© 2021 V2EX