c++ - 允许在模板函数中对浮点类型进行位移的变通方法

标签 c++ templates

首先让我说,我理解对浮点值执行移位和其他按位运算听起来毫无意义且不明智。所以,超越“你为什么要做这样的事情”的回答......

我有一个模板化函数,用于处理将各种类型序列化和反序列化到二进制流或从二进制流反序列化的某些部分。为了从字节流中“重组”多字节类型,我以通常的方式使用位移和按位或。还请假设我已控制字节顺序和其他此类问题。

切入点,我正在模板函数中寻找一种干净的方法来可靠地将变量转换为与参数类型大小相同的整数(这样我就可以对其执行按位运算);其中该参数类型可能是 float 或任何其他任意非整数类型。伪代码示例:

uint_same_size_as(U) sameSizeInt;

U 的类型为 float 时,uint_same_size_as(U) 的计算结果为 uint32_t,或 uint64_tUdouble 类型时,等等。

有这样的动物吗?如果这是我不知道的模板的基本功能,请原谅我。

最佳答案

由于 strict aliasing rule即使您会意识到该代码导致 UB 的方式。更好的方法是将变量地址转换为 [unsigned] char *并根据字节顺序向前或向后复制。目前尚不清楚为什么您需要复杂的移位方式来实现这一点。

尽管您可以使用 std::bitset<sizeof<T>*CHAR_BIT>在您的模板中,但我强烈怀疑简单地复制和移动位是否适用于不同大小的 float 类型。

关于c++ - 允许在模板函数中对浮点类型进行位移的变通方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41900146/

相关文章:

c++ - 右值不适用于引用

templates - 内置 "html/template"或 "mustache",我应该使用哪个?

模板构造函数中的 C++ 链接器错误 : "unresolved external symbol"

c++ - 为什么每次使用 std::random_device 和 mingw gcc4.8.1 运行都会得到相同的序列?

c++ - 如何在两点之间强制执行约束

c++ - OpenGL 淡入淡出问题

c++ - 为什么我的 DLL 在使用 MFC 作为 Visual Studio 2010 中的 DLL 的 MFC SDI 程序中使用时会泄漏?

c++ - 将构造函数参数传递给模板函数工厂

c++ - 如何默认初始化静态类模板变量

c++ - 从 char[] 访问对齐的 T & 的最有效方法是什么?