最新の C++ で列挙型をフラグとして使用するための適切なパターンは何ですか?
この質問は、技術仕様A Proposal to Add 2D Graphics Rendering and Display to C++ を読んだことに端を発しています。ここで、McLaughlin、Sutter、および Zink はCairo APIに基づく 2D グラフィックス用の C++ API を提案しています。
API 宣言全体を通して、作成者は C++11 を最大限に活用しています。特に、それらの列挙はすべて次のように宣言されます。
enum class font_slant {
normal,
italic,
oblique
};
1つを除いて:
namespace text_cluster_flags {
enum text_cluster_flags : int {
none = 0x0,
backward = 0x1
};
}
「text_cluster_flags
型」はクラス メソッドで使用されます。
void show_text_glyphs(const ::std::string& utf8,
const ::std::vector<glyph>& glyphs,
const ::std::vector<text_cluster>& clusters,
text_cluster_flags cluster_flags);
余分な宣言は、次のtext_cluster_flags
ようにマスクできるようにするためのものだと思います。
auto flag = text_cluster_flags::none | text_cluster_flags::backward;
enum class
列挙ではできません:
enum class flags {
a = 0x0,
b = 0x1
};
auto f = flags::a | flags::b; // error because operator `|` is
// not defined for enum class flags
// values
作成者はマスキング演算子を定義する必要がありましたか? それとも、名前空間内の列挙パターンは効果的な方法ですか?