序列化来自同一代码库的std::函数
Serializing a std::function from same codebase
我一直在使用std::函数使我的类更泛型,而不是创建虚成员,这将需要声明一个我只在一个地方使用的全新类,但是当需要序列化类时,我被难住了。我知道序列化随机c++代码的想法是行不通的,但这不是我需要做的。我知道这些函数已经存在于同一个二进制文件的其他地方,所以我觉得应该有一种方法来做到这一点。我也不反对用一些"黑客"的方式来做这件事,尽管最好它能与gcc和MSVC一起工作
如果您将id或"句柄"映射到可以序列化的函数集,并且以确定性的编译时方式执行此操作,则可以将句柄序列化为整数类型。在反序列化/加载时,您可以使用此确定性映射将句柄转换为相关的函数指针类型,并从中构造std::functions。
这与在类中序列化/反序列化指针没有太大区别。这种反序列化风格通常包括两个步骤:初始化POD类型,然后在第二次传递中修复指针。
我们可以用它的参数序列化std::函数,然后将它们存档到文件中,或者存档到网络中,这样我们就可以在重新启动机器后调用该函数(带指定的参数),或者更常见的是,在另一台机器上调用rpc.
下面是一个例子:
测试代码:https://github.com/galaxyeye/atlas/blob/master/libs/serialization/test/function.cpp实现:https://github.com/galaxyeye/atlas/blob/master/atlas/serialization/function.h
关于c++中易于使用的RPC框架,它使程序员能够像使用本机函数一样使用远程函数,请参阅我的github上的project pioneer。
我将在下星期一之前完成它。
例如,如果你想在集群中的所有机器上杀死一个进程,在你的管理器程序中,只需写:multicast_client客户;客户端。Call ("pkill", pkill, "a_bad_process");
我们假设服务器端程序实现了这样一个函数:Void pkill(const std::string&process_name);
希望有所帮助:)
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数