aCu*_*ria 13 c++ enums coding-style namespaces
如果所述枚举仅用于类成员函数,是否应该在类内部或外部声明枚举?
namespace nspace
{
// need to append OC, as this pollutes the current namespace
enum OUTSIDE_CLASS {OC_POINTS, OC_LINES, OC_LINE_LOOP, :::};
enum OTHER_ENUM {OE_POINTS};
class VertexBuffer
{
public:
enum INSIDE_CLASS {POINTS, LINES, LINE_LOOP, :::};
void foo(OUTSIDE_CLASS e);
void bar(INSIDE_CLASS e);
}
};
// usage
nspace::VertexBuffer v;
v.foo(nspae::VB_POINTS);
v.bar(nspace::VertexBuffer::POINTS); // more pedantic
Run Code Online (Sandbox Code Playgroud)
Mat*_* M. 14
真正的目标是避免污染范围(全局或命名空间)并帮助将相关值组合在一起(在IDE中使用自动完成工作的漂亮商品).
使用C++ 11,您可以使用以下命令声明强类型枚举:
enum class MyEnum {
Value0,
Value1
};
Run Code Online (Sandbox Code Playgroud)
必须被调用为MyEnum::Value0(而不是Value0).
在C++ 03中,您可以通过以下方式或多或少地模拟这个:
struct MyEnum {
enum Type {
Value0,
Value1
};
};
Run Code Online (Sandbox Code Playgroud)
但是,枚举的类型MyEnum::Type却略有不同.
懒惰的选择是将它转储到一个类中,但我仍然喜欢嵌套一个范围的枚举,即使在一个类中,只是为了清楚地表明这些值不是松散的,而是相互关联的.
如果只有你的类成员使用enum它,最好enum在类中声明.
这可以防止命名空间/全局空间因不必要的符号名称而受到污染,
并且对于类的用户来说它更直观,它有助于用户知道enum该类只会被类使用.
您应遵循的一般规则是:
不要在范围(全局/命名空间)中添加任何符号,该范围在该范围内不会被访问(因此不需要).