具有相同布局的不同类型之间的c++转换
C++ conversion between different types with the same layout
如果我有两个定义相同的结构体,在它们之间进行转换的最佳方法是什么?
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
并单独复制成员是一种解决方案,但这种情况将在许多函数中的许多不同的结构对中发生。不幸的是,修改A
、B
和Func1
的定义是不可能的,Func2
的签名也是不可能的。
据我所知,结构体A
和B
将在内存中表示相同。在两个这样的结构之间转换而不违反严格混叠的最快方法是什么?
可以强制转换指针。但是没有必要。由于是按值传递,因此需要创建正确类型的实例,因此只需执行
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;
}
相关文章:
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 在 Rcpp 中的字符串类型之间转换时出错
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 您可以在具有相同表示形式的类型之间reinterpret_cast吗?
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 包括数据类型之间的斗争
- 在不同类型之间转换常量指针
- 不同指针类型之间的无效比较:'type*' 和 'type&(*)()'
- 为什么 int 对象和函数类型之间不明确?
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 如何在任何两种类型之间reinterpret_cast
- 根据编译时条件在类型之间选择类型的惯用方法
- memcpy是否可以保留不同类型之间的数据
- 显式允许在主类型和用户定义类型之间进行类型转换
- 使用std::filesystem::path在分隔符类型之间进行转换
- 在函数指针类型之间转换