如何引用特定变量中的子元素?

时间:2015-06-01 03:11:45

标签: c++ casting

我的问题如下:我有一个64位变量,类型uint64_t(所以我知道它被指定为至少64位宽)。

我希望能够引用它的不同部分,例如将其分为两个uint32_t,四个uint16_t或八个uint8_t。是否有一种符合标准的方法,不依赖于未定义的行为?

我的方法如下:

class Buffer
{
  uint64_t m_64BitBuffer;

  public:
    uint64_t & R64() { return m_64BitBuffer; }
    uint32_t & R32(R32::Part part) { return *(reinterpret_cast<uint32_t*>(&m_64BitBuffer)+part); }
    uint16_t & R16(R16::Part part) { return *(reinterpret_cast<uint16_t*>(&m_64BitBuffer)+part); }
    uint8_t & R8(R8::Part part) { return *(reinterpret_cast<uint8_t*>(&m_64BitBuffer)+part); }
};

其中R32::PartR16::PartR8::Partenum,分别定义0到1,0和3以及0和7之间的值。

我想这应该没问题。例如,对齐应该没有问题。我想知道我是否违反任何规则,如果是,那么如何正确地做到这一点。

1 个答案:

答案 0 :(得分:0)

某些编译器允许通过联合进行类型惩罚,因此您可以简单地使用以下匿名联盟成员:

IBMDataObject

访问每个部分就像从相应的成员那里阅读一样简单。