我一直在使用 std::functions 使我的类更通用,而不是制作虚拟成员,这需要声明一个我只在一个地方使用的全新类,但是当我需要序列化类时我很难过。我知道序列化随机 C++ 代码的想法行不通,但这不是我需要做的。我知道这些函数已经存在于同一个二进制文件的其他地方,所以我觉得应该有办法做到这一点。我也不反对以某种“hacky”的方式来做这件事,尽管最好它可以与 gcc 和 MSVC 一起使用
2 回答
如果将 id 或“句柄”映射到可序列化的函数集,并以确定性的编译时方式执行此操作,则可以将句柄序列化为整数类型。在反序列化/加载时,您可以使用此确定性映射将句柄转换为相关的函数指针类型,并从中构造 std::functions。
这与类中的序列化/反序列化指针没有太大区别。这种反序列化风格通常包括两个步骤:初始化 POD 类型,然后在第二遍中修复指针。
我们可以用它的参数序列化一个std::function,然后将它们归档到一个文件中,或者归档到网络中,这样我们就可以在我们重新启动机器后调用这个函数(带有指定的参数),或者更常见的是,在另一台机器上,调用rpc。
这是一个例子:
测试代码: https ://github.com/galaxyeye/atlas/blob/master/libs/serialization/test/function.cpp 实现: https ://github.com/galaxyeye/atlas/blob/master/atlas/序列化/function.h
一个易于使用的 C++ RPC 框架,它使程序员可以像使用本地函数一样使用远程函数,请参阅我的 github 上的项目先锋。
我会在下周一之前完成它。
例如,如果你想杀死集群中所有机器上的一个进程,在你的管理器程序中,只需要写:
多播客户端客户端;client.call("pkill", pkill, "a_bad_process");
我们假设服务器端程序实现了这样的函数: void pkill(const std::string& process_name);
希望有帮助:)