在我正在研究的C++项目中,我有一个标志值,它可以有四个值.这四个标志可以组合在一起.标志描述数据库中的记录,可以是:
现在,对于我希望保留此属性的每条记录,我可以使用枚举:
enum { xNew, xDeleted, xModified, xExisting }
Run Code Online (Sandbox Code Playgroud)
但是,在代码的其他地方,我需要选择哪些记录对用户可见,所以我希望能够将其作为单个参数传递,如:
showRecords(xNew | xDeleted);
Run Code Online (Sandbox Code Playgroud)
所以,似乎我有三个可能的附件:
#define X_NEW 0x01
#define X_DELETED 0x02
#define X_MODIFIED 0x04
#define X_EXISTING 0x08
Run Code Online (Sandbox Code Playgroud)
要么
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Run Code Online (Sandbox Code Playgroud)
要么
namespace RecordType {
static const uint8 xNew = 1;
static const uint8 xDeleted = 2;
static const uint8 xModified = 4;
static const uint8 xExisting = 8;
}
Run Code Online (Sandbox Code Playgroud)
空间要求很重要(字节与整数),但并不重要.使用定义我失去了类型安全性,并且enum我失去了一些空间(整数),并且当我想要进行按位操作时可能需要进行转换.随着 …
正在看一下boost asio ssl_client.cpp的例子,发现这是正确的:
enum { max_length = 1024 };
Run Code Online (Sandbox Code Playgroud)
不知道,这和之间有什么区别
namespace {
const int max_length = 1024;
}
Run Code Online (Sandbox Code Playgroud)
要么
static const int max_length = 1024;
Run Code Online (Sandbox Code Playgroud)
或者它们绝对平等,但这只是更短?
很多模板化的代码看起来像这样:
template <typename T>
class foo
{
enum { value = <some expr with T> };
};
Run Code Online (Sandbox Code Playgroud)
一个例子可以看出这里的主要检查程序,我已经在阶乘实现看过一次了.
我的问题是为什么要使用无名的枚举?这有什么特别的原因吗?例如,静态const int也可以起作用吗?
编辑:
@Benoît:感谢您的链接,它提供了我所寻找的洞察力!