如何获取enum的位范围或struct bit field的位大小?
如何获取结构体位域的位大小或枚举的位范围?
想要获取结构体中位域的实际位大小,或是枚举类型的最小所需位范围(比如示例中Bar的成员最大值为7,需要3位),但使用基于sizeof的通用方法无法得到预期结果:
#include <climits> #include <iostream> #include <utility> template <typename T> auto bitsizeof() { return sizeof(T) * CHAR_BIT; } struct Foo { unsigned vi : 6; }; enum Bar { zero = 0, seven = 7 }; // 所需位范围为3位 int main() { std::cout << "char is " << bitsizeof<char>() << "\n"; std::cout << "int is " << bitsizeof<int>() << "\n"; std::cout << "long double is " << bitsizeof<long double>() << "\n"; // 结果不符合预期 std::cout << "Foo::vi is " << bitsizeof<decltype(std::declval<Foo>().vi)>() << " (预期为6)\n"; // 结果不符合预期 std::cout << "Bar is " << bitsizeof<Bar>() << " (预期为3)\n"; }
程序输出:
char is 8 int is 32 long double is 128 Foo::vi is 32 (预期为6) Bar is 32 (预期为3)
目前只能通过手动计算后硬编码的方式临时解决,比如:
constexpr std::size_t Bar_bitsize = 3; constexpr std::size_t Foo_vi_bitsize = 6;
但这种方式不够健壮,一旦位域或枚举成员修改,硬编码的值容易遗漏更新。
补充说明:
在C++(区别于C)中,未指定底层存储类型的枚举,其位范围由枚举成员的取值决定,若将枚举变量设置为超出该位范围的值,属于未定义行为。
内容的提问来源于stack exchange,提问作者Eljay
相关产品推荐
相关产品推荐

