C ++同名不同类型

问题描述

我有一个匿名union,其中包含一个uint8_t一个位字段struct

union
{
  struct
  {
    uint8_t ID : 1;
    uint8_t C : 4;
    uint8_t RM : 1;
    uint8_t SWRST : 1;
    uint8_t STS : 1;
  } ControlByte1;
  uint8_t ControlByte1;
};

您会看到uint8_tstruct实例都称为ControlByte1。我想做的是让ControlByte1成为uint8_t,同时能够使用ControlByte1.IDControlByte1.CControlByte1.RM,{{ 1}}和ControlByte1.SWRTS。不出所料,当我编写ControlByte1.STSControlByte1 = ...;... = ControlByte1;时,编译器无法知道我是说function(ControlByte1);ControlByte1还是{{1 }}。有什么办法吗?

谢谢!

编辑1:

我希望它们具有相同的名称,因为ControlByte1是一个1字节的I2C控制字节,其中包含ID,C,RM,SWRST和STS字段。我希望能够以字节的形式访问ControlByte1,并且还可以单独访问它的字段。

编辑2:

我可能已经找到了通过重载隐式类型转换运算符的方法

uint8_t

我不确定我是否正确地执行了重载,但是它确实可以编译,还没有尝试运行我的代码

struct

我猜测struct { uint8_t ID : 1; uint8_t C : 4; uint8_t RM : 1; uint8_t SWRST : 1; uint8_t STS : 1; operator uint8_t*() {return (uint8_t *)this;} operator uint8_t() {return *(uint8_t *)this;} } ControlByte1; 无法编译,因为我也需要重载uint8_t var1 = ControlByte1; // Compile uint8_t *ptr1 = ControlByte1; // Compile uint8_t *ptr2 = &ControlByte1; // Does not compile!!! var1 = ControlByte1; // Compile ptr1 = ControlByte1; // Compile ptr2 = &ControlByte1; // Does not compile!!! 运算符?不需要重载赋值运算符,因为我不会直接向&ControlByte1赋值。

编辑3:

这更有意义。

&

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)