【发布时间】:2012-03-25 01:37:05
【问题描述】:
标准允许人们在整数类型、enum 和std::bitset 之间进行选择。
考虑到这些选择,为什么库实现者会使用其中一个?
例如,llvm 的 libcxx 似乎使用了(至少)以下两个实现选项的组合:
ctype_base::mask 使用整数类型实现:
<__locale>
regex_constants::syntax_option_type 使用 enum + 重载运算符实现:
<regex>
gcc项目的libstdc++全部使用了三个:
ios_base::fmtflags 使用枚举 + 重载运算符实现:<bits/ios_base.h>
regex_constants::syntax_option_type 使用整数类型实现,
regex_constants::match_flag_type 是使用 std::bitset 实现的
两者:<bits/regex_constants.h>
AFAIK,gdb 无法“检测”这三个选项中任何一个的位域,因此增强调试不会有任何区别。
enum 解决方案和整数类型解决方案应始终使用相同的空格。 std::bitset 似乎并不能保证 sizeof(std::bitset<32>) == std::uint32_t 所以我看不出 std::bitset 有什么特别吸引人的地方。
enum 解决方案的类型安全性似乎稍差一些,因为掩码的组合不会生成枚举器。
严格来说,上述内容是针对 n3376 而不是 FDIS(因为我无权访问 FDIS)。
我们将不胜感激。
【问题讨论】:
-
N3376 只是 C++11 标准的修订版,它修复了一些小的编辑问题。内容没有区别。
-
我很清楚,只是想清楚一点。感谢您对这些链接的帮助:)
-
我想你已经知道了,但我认为它值得重复:通常情况下,枚举类型可以保存比它们的枚举数集更多的值,所以二进制操作可以很好他们。事实上,确保它工作更容易,因为我们可以知道指定一个显式的底层类型。
-
无论标准如何保证这些替代方案中的任何一个,实现者都可以向
bitset添加更多整数类型、枚举类型功能或附加约束。但这些类型与效率无关,因此不太可能做出任何努力。
标签: c++ enums c++11 bitmask libc++