V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1YsX1
V2EX  ›  C++

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

  •  
  •   1YsX1 · 2020-11-01 10:49:54 +08:00 · 2757 次点击
    这是一个创建于 1489 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    我用工厂模式构造了一个通过字符串来返回具体子类的基类函数,字符串与子类的 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-01 12:11:51 +08:00
    为什么要保存函数指针?函数名不好么?动态加载不就可以了。
    tairan2006
        2
    tairan2006  
       2020-11-01 12:15:17 +08:00
    啥玩意,你要序列化函数指针干啥?反射听过没
    tairan2006
        3
    tairan2006  
       2020-11-01 12:15:55 +08:00
    当然 C++不支持反射,但是思想类似
    hitmanx
        4
    hitmanx  
       2020-11-01 13:00:23 +08:00
    dlsym
    1YsX1
        5
    1YsX1  
    OP
       2020-11-01 14:25:22 +08:00
    @feelapi
    @tairan2006
    @hitmanx
    谢谢几位大佬指路!
    xuanbg
        6
    xuanbg  
       2020-11-01 14:35:56 +08:00
    想不通序列化指针有啥用?
    msg7086
        7
    msg7086  
       2020-11-01 17:13:25 +08:00
    指针当然会变啊。
    hacher
        8
    hacher  
       2020-11-01 18:38:43 +08:00
    函数指针本质是内存地址, 不知道你运行环境是什么, 在 windows 下函数地址和程序基址的偏移是固定的: diff = &function - GetModuleHandle(nullptr)
    你保存 diff, 下次运行时加上程序基址就是函数地址了: function = diff + GetModuleHandle(nullptr)
    要注意的是这个偏移每次编译后都会变化的~
    togou
        9
    togou  
       2020-11-02 12:25:09 +08:00
    函数指针算数据么? 一般来说就数据或者数据结构需要序列化
    newmlp
        10
    newmlp  
       2020-11-07 15:42:26 +08:00
    函数指针当然每次程序运行的时候不一样,保存函数指针没啥意义吧,保存函数名还是可以的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4108 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:11 · PVG 12:11 · LAX 20:11 · JFK 23:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.