是否嵌套枚举 class?
Nest enum class or not?
一个可以有独立的枚举-classes:
enum class StreamOpenMode
{
read,
write,
readWrite
};
class Stream
{
public:
Stream(StreamOpenMode openMode)
//...
};
或者将它们嵌套在另一个 class:
class Stream
{
public:
enum class OpenMode
{
read,
write,
readWrite
};
Stream(OpenMode openMode)
//...
};
选择一个而不是另一个的技术原因是什么?
比如嵌套的variety不能前向声明,在大项目中可能会导致循环依赖问题。
For example, the nested variety can't be forward declared, which might lead to circular dependency issues in large projects.
公平地说,这本身可能是最强的技术原因。
您还会发现 Argument-Dependent Lookup 依赖于共享范围:
namespace N
{
struct A
{
enum class B { aB };
friend void f(B);
};
}
void test(N::A::B x)
{
f(x); // f found by ADL, since x's type is a member of A
}
一个不同的例子可能会展示一个完整的 套件 class 类似于 Stream
,每个都有自己的 similar-but-different 范围枚举。将其作为成员可以更轻松地从模板上下文中使用所述作用域枚举 (T::OpenMode
!)。但是,在那种情况下,成员类型别名将使将作用域枚举保留在 class.
之外变得非常简单
一个可以有独立的枚举-classes:
enum class StreamOpenMode
{
read,
write,
readWrite
};
class Stream
{
public:
Stream(StreamOpenMode openMode)
//...
};
或者将它们嵌套在另一个 class:
class Stream
{
public:
enum class OpenMode
{
read,
write,
readWrite
};
Stream(OpenMode openMode)
//...
};
选择一个而不是另一个的技术原因是什么? 比如嵌套的variety不能前向声明,在大项目中可能会导致循环依赖问题。
For example, the nested variety can't be forward declared, which might lead to circular dependency issues in large projects.
公平地说,这本身可能是最强的技术原因。
您还会发现 Argument-Dependent Lookup 依赖于共享范围:
namespace N
{
struct A
{
enum class B { aB };
friend void f(B);
};
}
void test(N::A::B x)
{
f(x); // f found by ADL, since x's type is a member of A
}
一个不同的例子可能会展示一个完整的 套件 class 类似于 Stream
,每个都有自己的 similar-but-different 范围枚举。将其作为成员可以更轻松地从模板上下文中使用所述作用域枚举 (T::OpenMode
!)。但是,在那种情况下,成员类型别名将使将作用域枚举保留在 class.