具有最小样板的 C++ 类 "upgrade"

标签 c++ serialization dynamic reflection types

假设我有以下内容:

struct C1 { int w; }
struct B1 { int x; int y; int z; C1 c; };
struct A1 { int x; int y; int z; B1 b; };
struct C2 { long w; short t; }
struct B2 { int x; int y; int z; C2 c; };
struct A2 { int x; int y; int z; B2 b; };

我想实现这个功能

A2 upgrade(const A1 &a1);

它获取 a1 对象,并从中创建一个 a2 对象(假设 a2.w = a1.wa2.t = 6)。

一个理想的(但据我所知是不可能的)实现如下所示:

A2 upgrade(const A1 &a1) {
    dynamic d = to_dyn(a1);
    d["b"]["c"]["w"] = (long)d["b"]["c"]["w"];
    d["b"]["c"]["z"] = (short)5;
    A2 a2 = from_dyn(d);
    return a2;
}

在实际的 C++ 中,我能多接近这个?

最佳答案

由于所有类都是聚合,最简洁直接的方法是使用聚合初始化:

A2 upgrade(const A1& a) {
    return {a.x, a.y, a.z, {a.b.x, a.b.y, a.b.z, {a.b.c.w, (short)5}}};
}

C++ 没有任何工具可以迭代类型成员,无论是编译时还是运行时。
有人正在研究向该语言添加这样的编译时工具的提案,但它仍然需要做很多工作。

关于具有最小样板的 C++ 类 "upgrade",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26829851/

相关文章:

c++ - 使用 libcurl 编写 HTTPS SOAP 客户端

python - SWIG 将 map vector 转换为 python 字典列表

java - 将对象按原样保存在数据库中还是保存为 json?

python - json.dump 无法序列化包含 python 列表的字典

基于窗口高度和第二个div高度的Javascript动态div高度

javascript - call 和 apply 和有什么不一样?

c - 如何初始化动态分配结构的成员

C++将值传递给函数中的二维字符数组

c# - 如何使用 C# .net 从命令行调用带有多个参数的 C++ exe

java - 序列化对象存储什么信息?