Каков подходящий шаблон для использования перечислений в качестве флагов в современном C++?
Вопрос связан с тем, что я прочитал техническую спецификацию Предложение добавить рендеринг и отображение 2D-графики в C++, где Маклафлин, Саттер и Зинк предлагают C++ API для 2D-графики на основе Cairo API.
Во всем объявлении API авторы в полной мере используют C++11. В частности, все их перечисления объявлены следующим образом:
enum class font_slant {
normal,
italic,
oblique
};
Кроме одного:
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
Должны ли авторы определять операторы маскирования? Или их шаблон enum-ininin-namespace является эффективной практикой?