怎么在编译期知道结构体有哪些成员对象
|
ugpuFeb 21, 2023
1
auto ptr = &struct
send_buff(&ptr, len(struct)) ???? 类似这样 最基础的 |
|
7
有 protobuf 可以用 我在知乎上看评论 protobuf 可以实现反射 有人指路一下吗 具体一点
|
|
polytheneFeb 21, 2023
8
编译期反射 14/17 都不支持吧,pb 能做到是因为它能从 IDL 文件里拿到字段的偏移量,而不是靠编译期反射吧
|
|
JiavwenFeb 21, 2023
9
必然有个元数据记录 struct 中每个元素的首地址和偏移量啊
|
|
boboliuFeb 21, 2023
10
pb 是自己 IDL + codegen 来的
你要反射的话就只能自己组织元数据了,比如 https://github.com/netcan/recipes/blob/master/cpp/metaproggramming/reflection/StaticRefl.cpp |
|
kevinlqFeb 21, 2023
11
建议先学习第三方库如何使用、再研究如何实现的,最后如果想自己造轮子再试着撸一个。
可以看看 protobuf ,msgpack 啊这些, 也可以看看 Qt 的元对象实现 |
|
GeruzoniAnsasuFeb 21, 2023
12
啊? 序列化结构体
boost::serialization |
|
mingl0280Feb 22, 2023 via Android
13
结构体是 POD 的:头文件直接转 char 或者 unsigned char 。
非 POD 的:头文件+序列化 /反序列化函数 |
|
mingl0280Feb 22, 2023 via Android
14
要获取成员涉及到一些模板元编程的东西,你现在没必要研究这个
|
|
786375312123Feb 22, 2023
15
编译期知道结构体有哪些成员对象?
太难了,你连编译期间 enum 里有那些成员都没法弄清楚,还需要写一个标记开头结尾。 就这么看编译期间想知道类里有什么根本做不到,除非这个类是模板类?模板类能做到么?我没试过。 |
|
xy629Feb 22, 2023
16
#include <iostream>
#include <fstream> #include <sstream> #include <string> #include <vector> #include <cstdlib> #include <stdexcept> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/archive/binary_oarchive.hpp> struct MyStruct { int i; double d; std::string s; // 序列化成文本格式 template <class Archive> void serialize(Archive & ar, const unsigned int version) { ar & i; ar & d; ar & s; } }; int main() { // 将结构体序列化为二进制格式并写入文件 { MyStruct s{42, 3.14, "hello world"}; std::ofstream ofs("data.bin", std::ios::binary); boost::archive::binary_oarchive oa(ofs); oa << s; } // 从文件中读取二进制数据并反序列化为结构体 { MyStruct s; std::ifstream ifs("data.bin", std::ios::binary); boost::archive::binary_iarchive ia(ifs); ia >> s; // 验证反序列化结果是否正确 if (s.i != 42 || s.d != 3.14 || s.s != "hello world") { throw std::runtime_error("Deserialization failed"); } } return 0; } |
|
AlohaV2Feb 22, 2023
17
感觉可以看一下 protobuf
|
|
blinueFeb 22, 2023
18
不追求安全性的话可以看一下 https://github.com/niXman/yas
最大的优点是唯头文件,速度也很快。 |
|
19
用 boost 的序列化库解决了
|
|
alqazMar 1, 2023
21
可以试试 iguana
|