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

C++ 如果我有两个成员完全相同但名称不同的结构/类,有没有简单的方法将一个转换为另一个?,c++,C++,我说的是几十个成员,所以我会避免像创建一个转换函数那样逐个复制所有内容 您不应该有两个成员完全相同但名称不同的数据类型。这只是多余的代码,试着去掉多余的类型 如果由于某种原因您不能(很难相信您不能),只需使用reinterpret\u cast将一种类型转换为另一种类型即可 请注意,类/结构的组成必须完全相同,并且没有任何虚拟成员。最好的办法是通过根本没有这种冗余来解决这个问题。这不是 我确信您无法应用的一个简单解决方案(否则您已经这样做了)是将两种类型的通用语法移动到一个基类,并将语义差异分离

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

  • 您不应该有两个成员完全相同但名称不同的数据类型。这只是多余的代码,试着去掉多余的类型
  • 如果由于某种原因您不能(很难相信您不能),只需使用
    reinterpret\u cast
    将一种类型转换为另一种类型即可

  • 请注意,类/结构的组成必须完全相同,并且没有任何虚拟成员。

    最好的办法是通过根本没有这种冗余来解决这个问题。这不是

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

    如果这是不可能实现的,您可以使用适配器类来封装您拥有的两种类型中的任何一种,并使用相同的接口访问它们

    Obj2 o2;
    Adapter<Obj2> a(o2);
    a.getFirstMember();
    
    这通常很难保证,而且如果编译器在这两个类中的一个类中为您添加一些内容(几个月内进行一次无害的重构可能很容易导致此问题),那么这一点就变得更加重要了

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

    没有其他方法可以创建一个到另一个的函数,无论如何,这是最合乎逻辑的事情。也许您可以编写一个宏,以某种方式遍历字段。。。但重点是什么呢?这只会使代码更加不稳定和难以理解。如果每个字段都是完全相同的类型,并且它们的顺序相同,那么也许您可以从一个字段强制转换到另一个字段,但我仍然会避免这种情况。

    使用关键字union。它不脆

    我在使用D3D11X库项和DirectX10编写游戏引擎时遇到了这种需求。例如,如果您有一个向量(3个浮点),并且不想将其强制转换为D3D11X_向量或DX11_向量或其他任何形式,则可以创建一个结构,该结构是两者的并集。(有时,就像图形驱动程序一样,代码不是您的,您无法更改样板下面的任何内容。)


    首先,为什么有两个相同的结构?它们或基类或内容中是否有任何
    虚拟的
    ?有推荐人吗?它们中有任何析构函数、内容或基类吗?这个需要多便携?您是否拥有一个或其他类定义并可以更改它们?一切都是公开的吗?你能改变它们的使用方式吗?假设100%相同的布局ClassA*a=reinterpret_cast(b),将允许你创建指向ClassB实例的ClassA类型指针。如果出于某种原因,同一个结构有两个不同的用途,并且用两个(或更多)不同的名称引用它是有益的,为什么不为所有的名称创建typedef呢?如果您强制转换,我认为,您还应该添加一些代码,以确保两个类的成员确实具有相同的偏移量,如下所示:
    assert(&((A)0)->x==&((B)0)->x)
    分配强制转换的结果类似于创建浅层副本。这可能会导致严重的错误。即使使用相同的对象布局,由于别名冲突,取消引用该
    重新解释强制转换的结果也是未定义的行为。@Cubbi感谢您指出这一点。更多信息:谢谢,我将检查此rein因为每个人都想知道为什么我有两个相同的声明,问题是我正在重写一个非常大的库来改进它,因为这需要一些时间,而且我正在逐渐删除它们的声明,我希望能够暂时拥有像我的函数(我的变量)=它们的函数这样的东西(他们的_变量),其中my_变量和他们的_变量有不同的名称,但实际上是相同的结构。
    
    Obj1 *p = reinterpret_cast<Obj1 *>(&obj2);
    
    memcmp(&obj1, &obj2, sizeof(Obj1)) == 0 && sizeof(obj1) == sizeof(obj2)