使用不带参数的函数访问结构元素

Accessing structure elements using a function without arguments

本文关键字:函数 访问 结构 元素 参数      更新时间:2023-10-16

我正在尝试创建一个应该包含一个字节的结构,并使访问它的位变得容易。目标代码应该与我的结构一起工作,如下所示:

data8_t data;
data = 7;
unsigned char temp_data = data; 
cout << "6th bit value = " << data.toBits().b6 << endl;
data.toBits().b2 = 1;

然而,我不知道如何为包含以下内容的零件编码:

data.toBits().b6 
data.toBits().b2

在调用一个不带参数的函数(该函数也属于结构(后,如何使用元素标识符?

包含位字段的变量被特别要求为一个字节长,我的data8_t结构目前看起来是这样的:

struct data8_t{
uint8_t data;
uint8_t b0;
uint8_t b1;
uint8_t b2;
uint8_t b3;
uint8_t b4;
uint8_t b5;
uint8_t b6;
uint8_t b7;
data8_t(){
b0=(data & 0x01)>>0;
b1=(data & 0x02)>>1;
b2=(data & 0x04)>>2;
b3=(data & 0x08)>>3;
b4=(data & 0x10)>>4;
b5=(data & 0x20)>>5;
b6=(data & 0x40)>>6;
b7=(data & 0x80)>>7;
}
template <typename T>
void operator=(T rhs){
data = (uint8_t) rhs;
b0=(data & 0x01)>>0;
b1=(data & 0x02)>>1;
b2=(data & 0x04)>>2;
b3=(data & 0x08)>>3;
b4=(data & 0x10)>>4;
b5=(data & 0x20)>>5;
b6=(data & 0x40)>>6;
b7=(data & 0x80)>>7;
}
operator unsigned char() const{
return (unsigned char) data;
}
};

它并不优雅,但它适用于:

data = 7;
unsigned char temp_data = data; 

您应该尝试使用c++位字段,它应该完全按照您的意愿执行,并避免重复数据。你可以这样实现,例如:

struct data8_t
{
template <typename T>
void operator=(T rhs) {
data = (uint8_t)rhs;
}
union
{
uint8_t data;
struct {
uint8_t b0 : 1,
b1 : 1,
b2 : 1,
b3 : 1,
b4 : 1,
b5 : 1,
b6 : 1,
b7 : 1;
};
};
};

这样使用:

int main()
{
data8_t b;
for(int i = 0; i < 15; i++)
{
b = i;
std::cout << (uint32_t)b.b0 << (uint32_t)b.b1 << (uint32_t)b.b2 << (uint32_t)b.b3 << (uint32_t)b.b4 << (uint32_t)b.b5 << (uint32_t)b.b6 << (uint32_t)b.b7 << std::endl;
}
}

如果你真的想有一个功能来访问它,我想你可以这样做:

struct data8_t
{
struct bitfield
{
template <typename T>
void operator=(T rhs) {
data = (uint8_t)rhs;
}
operator unsigned char() const {
return (unsigned char)data;
}
union
{
uint8_t data;
struct
{
uint8_t b0 : 1,
b1 : 1,
b2 : 1,
b3 : 1,
b4 : 1,
b5 : 1,
b6 : 1,
b7 : 1;
};
};
};
template <typename T>
void operator=(T rhs) {
_data = (uint8_t)rhs;
}
operator unsigned char() const {
return (unsigned char)_data;
}
bitfield& toBits() { return _data; }
private:
bitfield _data;
};

编辑-使toBits与赋值运算符按位工作