標準では、整数型、enum
、およびから選択できますstd::bitset
。
これらの選択肢を考えると、なぜライブラリの実装者は一方を他方よりも優先して使用するのでしょうか?
適切な例として、llvm の libcxx は、これらの実装オプションの (少なくとも) 2 つの組み合わせを使用しているようです。
ctype_base::mask
整数型を使用して実装されます。
<__locale>
regex_constants::syntax_option_type
enum
+ オーバーロード
された演算子を使用して実装されます。<regex>
gcc プロジェクトの libstdc++ は3 つすべてを使用します。
ios_base::fmtflags
列挙型 + オーバーロードされた演算子を使用して実装されます。<bits/ios_base.h>
regex_constants::syntax_option_type
整数型を使用して
実装され、
Bothregex_constants::match_flag_type
を使用して実装されます。std::bitset
<bits/regex_constants.h>
私の知る限り、gdbはこれら3つの選択肢のいずれのビットフィールドネスも「検出」できないため、強化されたデバッグとの違いはありません。
enum
解と整数型の解は、常に同じスペースを使用する必要があります。std::bitset
を保証するものではないようですsizeof(std::bitset<32>) == std::uint32_t
ので、何が特に魅力的なのかわかりませんstd::bitset
。
マスクのenum
組み合わせは列挙子を生成しないため、解決策は型の安全性がわずかに低いようです。
厳密に言えば、上記はn3376に関するものであり、FDIS に関するものではありません (私は FDIS にアクセスできないため)。
この分野で利用可能な啓発をいただければ幸いです。