在现代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
};
除了一个:
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-in-namespace 模式是否有效实践?
答案 0 :(得分:1)
它以cairo API为模型。
对于font_slant
,我们可以看到cairo的等价物:
枚举cairo_font_slant_t
typedef enum { CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_OBLIQUE } cairo_font_slant_t;
根据倾斜度指定字体的变体。
CAIRO_FONT_SLANT_NORMAL
直立字体 风格,自1.0以来
CAIRO_FONT_SLANT_ITALIC
斜体字体 风格,自1.0以来
CAIRO_FONT_SLANT_OBLIQUE
倾斜字体 风格,自1.0以来
对于text_cluster_flags
,我们可以看到cairo的等价物:
枚举cairo_text_cluster_flags_t
typedef enum { CAIRO_TEXT_CLUSTER_FLAG_BACKWARD = 0x00000001 } cairo_text_cluster_flags_t;
指定文本群集映射的属性。
CAIRO_TEXT_CLUSTER_FLAG_BACKWARD
簇阵列中的簇映射到字形数组中的字形 结束开始。 (自1.8起)
函数text_to_glyphs
模型cairo_show_text_glyphs
,其中cairo_text_cluster_flags_t
。此外,API具有获取当前倾斜的功能。所以我的猜测是:
enum class
适用于标记的强类型。拥有“正常”和“斜体”的东西没有任何意义。它们附在“字体”上。
text_cluster_flags
是一次性交易。如果将其设置为show glyphs函数,则只会更改行为。它没有附加到“文本集群”,像倾斜附加到“字体表面”。这里没有强力打字的理由。
你的解释是正确的顺便说一句。这是源代码的片段:
// ...
+ const cairo_glyph_t *cur_glyph;
+
+ if (cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD)
+ cur_glyph = glyphs + num_glyphs - 1;
+ else
+ cur_glyph = glyphs;
+
+ for (i = 0; i < num_clusters; i++) {
+ cairo_bool_t cluster_visible = FALSE;
+
// ...