c++ - 在没有 union 的情况下对来自不同第三方库的两种类型进行双关

标签 c++

我读到使用 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/

相关文章:

c++ - WinAPI 鼠标单击无法正常工作

c++ - itoa 和 uitoa 用法

c++ - 我将如何分开这个类(class)?

c++ - 如何忽略 umask 以创建具有给定权限的文件

c++ - 将文件中的值添加到 C++ 中的哈希类型结构

c++ - 没有已知的从指针到指针引用的转换

c++ - 为什么相同标识符的大小在 C 和 C++ 中不同?

c++ - 使用 QtConcurrent::run 在单独的线程上连接信号/插槽

c++ - CMake 没有找到特定的 boost 库 (boost_random)

c++ - 使用 vector 和正斜杠进行字符串算术