我开发了一个简单的模板函数来交换单个字段的字节顺序:
template <typename T> inline void SwapEndian(T& ptr) {
char *bytes = reinterpret_cast<char*>(&ptr);
int a = sizeof(T) / 2;
while (a--) {
char tmp = bytes[a];
int b = sizeof(T) - 1 - a;
bytes[a] = bytes[b];
bytes[b] = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
我会经常在T = int
或float
.这两种类型在目标平台上由4个字节表示,并且可以由模板的相同特化处理.
因为这个函数有时负责处理原始数据的大缓冲区,所以我创建了一个优化的特化:
template<> inline void SwapEndian(float& ptr) {
#if defined(__GNUC__)
*reinterpret_cast<unsigned*>(&ptr) = __builtin_bswap32(*reinterpret_cast<unsigned*>(&ptr));
#elif defined(_MSC_VER)
*reinterpret_cast<unsigned*>(&ptr) = __byteswap_ulong(*reinterpret_cast<unsigned*>(&ptr));
#endif
}
Run Code Online (Sandbox Code Playgroud)
这个专门化也适用于32位整数,有符号或无符号,所以我有一大堆重复,只有类型名称不同.
如何通过这个模板路由所有4字节POD类型的实例?(PS.我愿意以不同的方式解决这个问题,但在这种情况下,我想明确知道是否可以构建这些元专用模板.)
编辑:谢谢大家,在阅读了答案并意识到算术比pod更好的限制之后,我受到了启发,写了一些东西.所有答案都很有用,但我只能接受一个,所以我接受了一个似乎在结构上相同的答案.
template<bool, bool> struct SwapEndian_ { template<typename T> static inline void …
Run Code Online (Sandbox Code Playgroud) c++ templates endianness specialization template-specialization