这是一个非常具体的问题,我几乎完全确定它不可能,但我想我会试一试。
我有一些看起来像这样的结构:
struct ParentStruct
{
int valueA;
const ChildStruct *pointerB;
const AnotherChildStruct *pointerC;
}
struct ChildStruct
{
int valueB;
float valueC;
const AnotherChildStruct *pointerD;
}
struct AnotherChildStruct
{
float valueD;
const ChildStruct *pointerE;
}
在以后的版本中,这些结构可能变得非常大,在其中嵌套其他结构。唯一的保证是所有这些结构都是聚合的,所有这些结构都将存在于连续记忆的单个块中。
为了使ParentStruct
可以简单地复制,我想转换ParentStruct
实例中的所有指针以及`ParentStruct的任何子节点引用的任何指针(实际上是那些的任何子节点)从struct的地址偏移,然后能够将这些偏移转换回指针。
这意味着以伪代码的样式对结构的每个成员进行深度优先扫描:
template <typename T>
{
void serialize(T const& X, byte& origin)
{
//scan through every member of X
for(auto member : X)
{
if(is_pointer(member))
{
serialize<type_of(member) const&>(&member, origin);
member = ((byte*) member) - origin;
}
}
}
}
反之亦然。
我如何实现上述伪代码?