具有相同布局的不同类型之间的c++转换

C++ conversion between different types with the same layout

本文关键字:同类型 之间 c++ 转换 布局      更新时间:2023-10-16

如果我有两个定义相同的结构体,在它们之间进行转换的最佳方法是什么?

struct A { int i; float f; };
struct B { int i; float f; };
void Func1(A);
void Func2(B);

Func2需要通过取B参数来调用Func1,使其成为A。它看起来像:

void Func2(B b) { Func1( (A) b); } //Obviously invalid cast

虽然创建A并单独复制成员是一种解决方案,但这种情况将在许多函数中的许多不同的结构对中发生。不幸的是,修改ABFunc1的定义是不可能的,Func2的签名也是不可能的。

据我所知,结构体AB将在内存中表示相同。在两个这样的结构之间转换而不违反严格混叠的最快方法是什么?

可以强制转换指针。但是没有必要。由于是按值传递,因此需要创建正确类型的实例,因此只需执行

void f2( B b ) { f1( A{ b.i, b.f } ); }

简单。

当直接的类型安全代码可以满足你的需要时,不要考虑强制类型转换。

您可以在Func2()的定义中看到代理类BA:

#include <iostream>
struct A { int i; float f; };
struct B { int i; float f; };
struct BA
{
  const B &b_;
  BA(const B &b)
  : b_(b) {}
  operator A() const
  {
     A a = {b_.i, b_.f};
     return a;
  }
};
void Func1(A a) { std::cout << a.i << " " << a.f << std::endl;};
void Func2(B b) { Func1(BA(b)); }
int main()
{
   B b = {2, 42.};
   Func2(b);
   return 0;
}