1YsX1
V2EX  ›  C++

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

By 1YsX1 at 2020 年 11 月 1 日 · 4038 次点击

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

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

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

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

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

10 条回复  •  2020-11-07 15:42:26 +08:00
feelapi
   1
feelapi  
   2020 年 11 月 1 日
为什么要保存函数指针?函数名不好么?动态加载不就可以了。
keenkiller
   2
keenkiller  
   2020 年 11 月 1 日
啥玩意,你要序列化函数指针干啥?反射听过没
keenkiller
   3
keenkiller  
   2020 年 11 月 1 日
当然 C++不支持反射,但是思想类似
hitmanx
   4
hitmanx  
   2020 年 11 月 1 日
dlsym
1YsX1
   5
1YsX1  
OP
   2020 年 11 月 1 日
@feelapi
@tairan2006
@hitmanx
谢谢几位大佬指路!
xuanbg
   6
xuanbg  
   2020 年 11 月 1 日
想不通序列化指针有啥用?
msg7086
   7
msg7086  
   2020 年 11 月 1 日
指针当然会变啊。
hacher
   8
hacher  
   2020 年 11 月 1 日
函数指针本质是内存地址, 不知道你运行环境是什么, 在 windows 下函数地址和程序基址的偏移是固定的: diff = &function - GetModuleHandle(nullptr)
你保存 diff, 下次运行时加上程序基址就是函数地址了: function = diff + GetModuleHandle(nullptr)
要注意的是这个偏移每次编译后都会变化的~
togou
   9
togou  
   2020 年 11 月 2 日
函数指针算数据么? 一般来说就数据或者数据结构需要序列化
newmlp
   10
newmlp  
   2020 年 11 月 7 日
函数指针当然每次程序运行的时候不一样,保存函数指针没啥意义吧,保存函数名还是可以的
© 2026 V2EX · 35ms · 3.9.8.5