c++ - 远程使用 C++ 模板函数

标签 c++ sockets templates messaging rpc

我目前有一个对象实现了一个复杂的系统,用于存储和读取多种类型的配置对象,可以很容易地在本地使用:

template <typename T>
void rdData(std::string path, T& ref);

template <typename T>
void wrData(std::string path, T& ref);

int value;
rdData("tree1.scalar", value);
struct my_struct;
wrData("tree1", my_struct);

T 类型可以是原始数据类型,也可以是定义在单独文件(例如 legal_structs.c)中的 POD C 结构。随着新结构的添加,这个定义结构的文件会随着时间的推移而增长。如果使用了错误的类型,则会抛出异常。

但是,现在我们想要让其他几个进程同时使用同一个系统。它可以通过套接字、RPC 或消息传递。

有没有办法像模板那样通过套接字确定对象的类型?例如,客户会做:

remote_rdData(path, data);

数据将作为原始字节传递给运行我们系统的服务器。 在服务器端,需要有一种方法来识别它是哪种数据类型,并使用适当的类型调用本地模板函数。 到目前为止,我看到的唯一方法是传输一个对象标识符(例如它的 type_info),并且在服务器中,有一个巨大的开关比较 type_info 并调用每个对象。但是,每次在系统中添加新结构时都需要附加它。

有没有更自动化的方法来在服务器端重建对象?

最佳答案

模板在运行时不做任何事情。它们在编译时被扩展。如果要反序列化流中的对象,则需要能够调用一些代码以根据从流中读取的类型代码构造正确的类型。模板与此无关。

最强大的解决方案通常是一些代码生成 - 只需编写一个简单的工具来为您生成丑陋的 switch 语句,并将其合并到您的构建过程中。

关于c++ - 远程使用 C++ 模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826476/

相关文章:

c++ - 错误 : no match for 'operator=' in 'iter = ((const FHlist<Employee>*)theList)->FHlist<Object>::begin [with Object = Employee]()'

c++ - 这是复制构造函数省略吗?

python - 套接字 : Reading UDP Packet

c# - 为什么在服务器应用程序中需要两个套接字?

c++ - 将 boost::optional 与常量类型一起使用 - C++

c++ - 如何测试某些代码不能用 C++ 编译?

c++ - 分配不完整类型 'T' c++

c++ - 为什么成员函数不更改我的对象数据成员?

c# - C# 和 C++ 中 switch 语句的区别

java - istream.write 之后的套接字 DataInputStream 和 EOF 标志 : Is there a "conflict" when writing with istream. writeUTF?