小编Mic*_*kLH的帖子

如何将C++模板专门用于所有32位POD类型?

我开发了一个简单的模板函数来交换单个字段的字节顺序:

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 = intfloat.这两种类型在目标平台上由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

4
推荐指数
1
解决办法
483
查看次数