如何修改我的代码以避免左移警告?

How do I rework my code to avoid left shift warning?

我有这个方法 read 用于从无符号字符指针 data 的地址读取整数数据类型。例如,如果 data 包含 0x12, 0x34, 0x56, 0x78, 0x9A,则 read<int>(1, ptrToMyInt) 应将 0x3456789A 放入 ptrToMyInt

示例:

class MyClass {
    public:
        MyClass();

        template <typename T> void read(int address, T *dest) {
            size_t size = sizeof(T);

            *dest = 0;

            for (unsigned int i = 0; i < size; i++) {
                *dest <<= 8;
                *dest |= data[address + i];
            }
        }

        static constexpr unsigned char data[] = { 0x12, 0x34, 0x56, 0x78 };
}

当我在 unsigned char 指针上使用此模板时(为了保持一致性,避免使用多个读取方法),它会发出警告,因为 *dest <<= 8; 行的偏移量超过了一个字节的宽度,并且编译器不够聪明,无法意识到它只在字节已经为 0 时发生一次。

例如:

MyClass c;

unsigned char x;
c.read(2, &x); // warning: shift count >= width of type
               // should and does put 0x56 into x

Demo

我想重新编写此代码以避免出现此警告,但我看不到 simple/elegant 重写它的方法。我该如何重写这段代码?

使用 C++17,你可能会这样做

template <typename T> void read(int address, T *dest) {
    constexpr size_t size = sizeof(T);

    if constexpr (size == 1)
    {
        *dest = data[address];
    } else {
        *dest = 0;

        for (unsigned int i = 0; i < size; i++) {
            *dest <<= 8;
            *dest |= data[address + i];
        }
    }
}