Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;具有相同布局的不同类型之间的转换_C++ - Fatal编程技术网

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

C++ C++;具有相同布局的不同类型之间的转换,c++,C++,如果有两个定义相同的结构,那么在它们之间转换的最佳方式是什么 struct A { int i; float f; }; struct B { int i; float f; }; void Func1(A); void Func2(B); Func2需要调用Func1,方法是取B参数并使其成为A。它看起来像: void Func2(B b) { Func1( (A) b); } //Obviously invalid cast 虽然创建A并单独复制成员是一种解决方案,但在许多函数中,许多不

如果有两个定义相同的结构,那么在它们之间转换的最佳方式是什么

struct A { int i; float f; };
struct B { int i; float f; };
void Func1(A);
void Func2(B);
Func2
需要调用
Func1
,方法是取
B
参数并使其成为
A
。它看起来像:

void Func2(B b) { Func1( (A) b); } //Obviously invalid cast
虽然创建
A
并单独复制成员是一种解决方案,但在许多函数中,许多不同的结构对都会出现这种情况。不幸的是,修改
A
B
Func1
的定义以及
Func2
的签名是不可能的


据我所知,结构
A
B
将在内存中以相同的方式表示。在两个这样的结构之间进行转换,同时又不违反严格别名等规则的最快方法是什么?

您可以强制转换指针。但是没有必要。因为您是通过值传递的,所以无论如何都需要创建一个正确类型的实例,所以只需这样做

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


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

您可以强制转换指针。但是没有必要。因为您是通过值传递的,所以无论如何都需要创建一个正确类型的实例,所以只需这样做

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


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

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

#包括
结构A{int i;float f;};
结构B{int i;float f;};
结构BA
{
康斯特食宿酒店;
文学士(康斯特食宿酒店)
:b_uB(b){}
运算符A()常量
{
A A={b_u.i,b_u.f};
返回a;
}
};

void Func1(A){std::cout您可以在Func2()的定义中使用代理类BA:

#包括
结构A{int i;float f;};
结构B{int i;float f;};
结构BA
{
康斯特食宿酒店;
文学士(康斯特食宿酒店)
:b_uB(b){}
运算符A()常量
{
A A={b_u.i,b_u.f};
返回a;
}
};

无效函数1(A){std::cout如果结构真的这么小,我只会复制成员,不会有未定义行为的风险。我知道。我只是想避免它,因为这些结构大约有一百个。对我来说,能够重新插入结构要比编写大量内联函数简单得多,但发现没有赌注ter way将是一个同样有用的答案。如果结构真的这么小,我只会复制成员,不会有未定义行为的风险。我知道。我只是想避免它,因为有大约一百个这样的结构。能够重新插入结构对我来说比编写大量内联函数简单得多,但是如果说没有更好的方法,也会是一个同样有用的答案。好的一点-我没有注意到参数无论如何都会被复制,所以避免它没有什么好处。好的一点-我没有注意到参数无论如何都会被复制,所以避免它也没有什么好处。