在C++中,如果我有两个具有完全相同成员但名称不同的结构/类,是否有任何简单的方法将一个转换为另一个?

Ioa*_*ana 2 c++

我说的是几十个成员,所以我真的会避免创建一个逐个复制所有内容的转换函数.

Vin*_*Pii 5

最好的办法是通过完全没有这种冗余来解决问题.这不是DRY.

一个简单的解决方案,我相信你不能应用(否则你已经这样做了),将两种类型的通用语法移动到基类,并将语义差异分成两个派生(可能是空的)类.

如果无法实现,则可以使用适配器类封装您拥有的两种类型中的任何一种,并使用相同的接口访问它们.

Obj2 o2;
Adapter<Obj2> a(o2);
a.getFirstMember();
Run Code Online (Sandbox Code Playgroud)

将指向一个对象的指针重新解释为指向另一个对象的指针也是可能的:

Obj1 *p = reinterpret_cast<Obj1 *>(&obj2);
Run Code Online (Sandbox Code Playgroud)

但是这两个对象确实需要具有相同的内存占用,例如,对于任何成员的任何可能值,在两种类型中都复制,以下必须始终为真:

memcmp(&obj1, &obj2, sizeof(Obj1)) == 0 && sizeof(obj1) == sizeof(obj2)
Run Code Online (Sandbox Code Playgroud)

这通常很难保证,如果编译器会在两个类中的一个中为你添加一些内容(在几个月内进行无辜的重构可能很容易引起这个问题),它就会变得更加重要.

例如,想一个虚拟析构函数.如果你在一个类中(作为唯一的虚拟成员)而不在另一个类中,那么那个类将具有vptr作为其第一个成员而另一个不具有,因此在两个类中访问该偏移将产生不同的结果.

  • 即使具有相同的对象布局,由于别名冲突,取消引用“reinterpret_cast”的结果也是未定义的行为。 (2认同)