C++ C++;“类”;“升级”;最小锅炉板

C++ C++;“类”;“升级”;最小锅炉板,c++,serialization,dynamic,reflection,types,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

假设我有以下几点:

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) {
    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;
}
我想实现这个功能

A2 upgrade(const A1 &a1);
这样它就获取a1对象,并从中创建a2对象(假设
a2.w=a1.w
a2.t=6

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

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) {
    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++没有任何工具可以迭代类型成员,无论是编译时还是运行时。

有人提议在语言中添加这样一个编译时工具,但它仍然需要做很多工作。

我试图避免这样做,因为这需要列出升级代码中的所有字段。@tohava:没有办法(现在)。增加了一些细节。当然,除非您准备脱离标准:只需
memcpy
,然后设置其余部分。应该在实践中起作用,但不能保证。@如果
C1
/
C2
字段不是这两个字段中的最后一个字段,则重复数据消除器在实践中不起作用。@重复数据消除器与布局兼容的规则可能会使其比您想象的更接近标准化。非子结构字段绝对与布局兼容。一个结构的前缀与另一个结构的布局兼容。如果没有标准的深入研究,我不知道组合的前缀是否也与布局兼容,但这两种方式都不会让我感到惊讶。现在,这只适用于普通的可复制数据,当然。@重复数据消除请查看标准中的“布局兼容”。对于标准布局类型,有相当好的保证,包括将指向具有相似前缀的类的指针投射到彼此,并访问所述前缀。然而,这需要标准布局,这有点限制。