- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
标准允许在整数类型、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>
据我所知,gdb 无法“检测”这三个选项中任何一个的位域性,因此增强调试不会有区别。
enum
解决方案和整数类型解决方案应始终使用相同的空间。 std::bitset
似乎不能保证 sizeof(std::bitset<32>) == std::uint32_t
所以我看不出 std::bitset
有什么特别吸引人的地方。
enum
解决方案似乎类型安全性稍差,因为掩码的组合不会生成枚举器。
严格来说,上述内容是关于 n3376 而不是 FDIS(因为我无权访问 FDIS)。
在此领域的任何可用启发将不胜感激。
最佳答案
真正令人惊讶的是,该标准将其限制为只有三种选择。为什么类类型不应该被接受?不管怎样……
int
的大小和范围。 .std::bitset
bitset<5>
可能具有更多的类型安全性和 bitset<6>
是不同的类型,加法是不允许的,但除此之外是不安全的,就像整数类型一样。如果他们允许 derived 来自 std::bitset<N>
的类型,这就不是问题了。 .很明显enum
s 是理想的选择,但经验证明类型安全确实是不必要的。所以他们给了实现者一个骨头,让他们走更容易的路。那么,简短的回答是懒惰导致实现者选择int
。或 bitset
.
派生自 bitset
的类型有点奇怪不允许,但这确实是小事。
子句提供的主要规范是在这些类型上定义的一组操作(即按位运算符)。
关于C++11 和 [17.5.2.1.3] 位掩码类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857239/
我是一名优秀的程序员,十分优秀!