1YsX1
V2EX  ›  C++

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

  •  
  •   1YsX1 · Nov 1, 2020 · 4149 views
    This topic created in 2194 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    10 replies  •  2020-11-07 15:42:26 +08:00
    feelapi
    feelapi
    Nov 1, 2020
    1
    为什么要保存函数指针?函数名不好么?动态加载不就可以了。
    keenkiller
    keenkiller
    Nov 1, 2020
    2
    啥玩意,你要序列化函数指针干啥?反射听过没
    keenkiller
    keenkiller
    Nov 1, 2020
    3
    当然 C++不支持反射,但是思想类似
    hitmanx
    hitmanx
    Nov 1, 2020
    4
    dlsym
    1YsX1
    1YsX1
    OP
    Nov 1, 2020
    5
    @feelapi
    @tairan2006
    @hitmanx
    谢谢几位大佬指路!
    xuanbg
    xuanbg
    Nov 1, 2020
    6
    想不通序列化指针有啥用?
    msg7086
    msg7086
    Nov 1, 2020
    7
    指针当然会变啊。
    hacher
    hacher
    Nov 1, 2020
    8
    函数指针本质是内存地址, 不知道你运行环境是什么, 在 windows 下函数地址和程序基址的偏移是固定的: diff = &function - GetModuleHandle(nullptr)
    你保存 diff, 下次运行时加上程序基址就是函数地址了: function = diff + GetModuleHandle(nullptr)
    要注意的是这个偏移每次编译后都会变化的~
    togou
    togou
    Nov 2, 2020
    9
    函数指针算数据么? 一般来说就数据或者数据结构需要序列化
    newmlp
    newmlp
    Nov 7, 2020
    10
    函数指针当然每次程序运行的时候不一样,保存函数指针没啥意义吧,保存函数名还是可以的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4893 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 113ms · UTC 08:02 · PVG 16:02 · LAX 00:02 · JFK 03:02
    ♥ Do have faith in what you're doing.