gpt4 book ai didi

c++ - 我还能如何访问位域成员?

转载 作者:行者123 更新时间:2023-12-03 06:53:23 25 4
gpt4 key购买 nike

所以我知道你不能有指向位域的指针,因为指针只能区分字节级别的地址,而不是位级别。也不允许引用位域。还有其他方法可以间接引用位域的成员吗?理想情况下,我可以使用类似于下面的 mys1array 行的数组语法来访问它们。我知道引用数组是非法的,但也许有人对一些可以实现类似目标的其他机制有一些明智的了解。

typedef struct{
unsigned short a : 5;
unsigned short b : 3;
unsigned short c : 8;
}myStruct;

class myClass{
public:
myStruct s1;
//unsigned short &mys1array[] = {&s1.a, &s1.b ,&s1.c};
};

最佳答案

您可以使用由 lambda 初始化的函数指针数组来访问具有不同函数的位域的每个元素。

class myClass {
public:
myStruct s1;
static constexpr unsigned short (*accessors)(myStruct const &s)[] = {
+[](myStruct const &s) -> unsigned short { return s.a; }
// ...
};
};

有了这个,您必须将 myStruct 的实例传递给函数。另一种方法是使用 std::function 并使用捕获 lambda:

class myClass {
public:
myStruct s1;
std::function<unsigned short()> accessors[3];

myClass(myStruct s)
: s1(s),
accessors{
[this]() -> unsigned short { return this->s1.a; },
// ...
}
{}

// ...
};

不要忘记,有了这个,您必须实现复制和移动构造函数以及赋值运算符,因为 lambda 捕获 this

关于c++ - 我还能如何访问位域成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64760973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com