如何确保位字段的成员位于基础类型的相同位置或确保位字段的成员位于精确位置

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

我想知道是否有可能进行编译时检查来验证两个不同位域中的成员是否处于同一位置。确切位置无关紧要。

struct A {
    uint8_t x : 1;
};
struct B {
    uint8_t y : 1;
};
static_assert(position_check<A, B>::value); // ?

这有可能吗?

或者,检查位域的成员是否占据了已知的位位置。

c++ bit-fields static-assert
1个回答
0
投票

这是一个可行的解决方案,它依赖于以下事实:从0xFF到位字段的隐式转换将在适当的位置设置一个位:

struct A {
    uint8_t x : 1;
};
struct B {
    uint8_t y : 1;
};

constexpr A a = { 0xFF };
constexpr B b = { 0xFF };
static_assert((uint8_t(a.x) ^ uint8_t(b.y)) == 0);

让我知道您是否认为它会起作用。

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