如何使用赋值运算符将结构体泛化为 int?

问题描述 投票:0回答:1

我正在尝试使用结构将多个较小的整数打包到

uint32_t
中。

struct PackedData {
    PackedData & operator=(uint32_t x) {
        a = (x >> 24) & 0xFF;
        b = (x >> 8) & 0xFFFF;
        c = x & 0xFF;
        return *this;
    }
    uint32_t operator=(PackedData x) {
        uint32_t temp;
        temp = (x.a << 24) & 0xFF000000;
        temp |= (x.b << 8) & 0xFFFF00;
        temp |= x.c & 0xFF;
        return temp;
    }

    uint32_t a : 8;
    uint32_t b : 16;
    uint32_t c : 8;
};

最初,我希望继承

uint32_t
,类似于使用
enum
类所做的事情。

struct PackedData : uint32_t {

不幸的是,这不能编译。

奇怪的是,我粘贴的结构确实可以编译,甚至不会发出警告

-Wall -Wextra --pedantic

好的一面是,我可以看到我的结构体有 4 个字节,并且我可以为该结构体分配一个 32 位整数。但是,我无法将该结构分配给 32 位整数。

我确信以下方法的语法是完全错误的,但我不知道怎么做,编译器也没有帮助我。

uint32_t operator=(PackedData x) {
    uint32_t temp;
    temp = (x.a << 24) & 0xFF000000;
    temp |= (x.b << 8) & 0xFFFF00;
    temp |= x.c & 0xFF;
    return temp;
}

这个想法可行吗,或者有更好的方法吗?

c++ struct assignment-operator
1个回答
0
投票

您可以定义隐式转换运算符,如下所示:

struct PackedData {

    // ...

    operator uint32_t () const {
        uint32_t temp;
        temp = (a << 24) & 0xFF000000U;
        temp |= (b << 8) & 0xFFFF00U;
        temp |= c & 0xFFU;
        return temp;
    }
};

现在你可以做:

PackedData p { 0xef, 0x1234, 0xab };
uint32_t x = p;

x
的值为
0xef1234ab

© www.soinside.com 2019 - 2024. All rights reserved.