我读到使用 union 进行类型双关实际上是 C++ 中的未定义行为,我想知道您将如何键入双关?
作为一个例子,我使用了一个 union 来从两个具有相同布局的第三方库中输入双关语类型,如下所示(libAQuaternion 和 libBQuaternion 是我无法更改的那些第三方库的类型):
struct libAQuaternion {
double x, y, z, w;
};
void libAFunc(libAQuaternion &p) {
p.x = p.y = p.z = p.w = 1.;
}
struct libBQuaternion {
double x, y, z, w;
};
void libBFunc(libBQuaternion &p) {
p.x = p.y = p.z = p.w = 2.;
}
union myQuat {
libAQuaternion a;
libBQuaternion b;
};
int main() {
myQuat q;
libAFunc(q.a);
libBFunc(q.b);
}
符合标准的最佳解决方案是什么?
最佳答案
What be the standard conforming best solution to this?
编写一个函数将一个四元数转换为另一个。
libBQuaternion convert(const libAQuaternion &Quat) {
return{Quat.x, Quat.y, Quat.z, Quat.w};
}
libAQuaternion convert(const libBQuaternion &Quat) {
return{Quat.x, Quat.y, Quat.z, Quat.w};
}
// or template if you want to
template<typename T, typename U>
T convertTo(U &&Quat) {
return{Quat.x, Quat.y, Quat.z, Quat.w};
}
任何优化器都应该能够完全优化这一点,因此不应该有性能损失。
但是如果有一个函数通过左值引用获取一个这样的类,这将是一个问题。您需要创建适当类的新对象,传递该对象,然后将正确的值重新分配给原始结构。我猜你可以为此创建一个函数,但 IMO 最简洁的方法是更改函数的签名以通过左值引用获取各个值,但这并不总是可行的。
如果不调用 UB,就无法在 C++ 中进行类型双关。
关于c++ - 在没有 union 的情况下对来自不同第三方库的两种类型进行双关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50305427/