C++ 检查是否已定义枚举成员?
我在命名空间中定义了一长串枚举成员:C++ 检查是否已定义枚举成员?,c++,enums,C++,Enums,我在命名空间中定义了一长串枚举成员: namespace nsexp{ enum expname{ AMS1, AMS2, BESS1, BESS2, ... }; } 对我来说,不时地评论其中的一些内容非常有用,比如: namespace nsexp{ enum expname{ AMS1, AMS2, BESS1, //BESS2, ... }; } 这样我就可以把他们从我的程序中排除
namespace nsexp{
enum expname{
AMS1,
AMS2,
BESS1,
BESS2,
...
};
}
对我来说,不时地评论其中的一些内容非常有用,比如:
namespace nsexp{
enum expname{
AMS1,
AMS2,
BESS1,
//BESS2,
...
};
}
这样我就可以把他们从我的程序中排除。但是,这会在函数中产生一些冲突:
strcpy(filename[nsexp::BESS2],"bess/data_exp2");
我也可以决定评论这一行,但如果我排除了许多成员,这可能会很累。是否有方法检查名称空间中是否存在成员
我要找的东西是:
if("BESS2 exists") strcpy(filename[nsexp::BESS2],"bess/data_exp2");
构建一个简单的checker对象,它允许您在运行时查询禁用标志的状态
#include <iostream>
#define RUNTIME_CHECKS 1
namespace nsexp{
enum expname{
AMS1,
AMS2,
BESS1,
BESS2,
// ...
NOF_EXPNAME
};
class checker
{
#if RUNTIME_CHECKS
struct impl
{
impl() {
std::fill(std::begin(disabled), std::end(disabled), false);
}
bool disabled[NOF_EXPNAME];
};
static impl& statics() {
static impl _;
return _;
}
public:
static void disable(expname e) {
statics().disabled[e] = true;
}
static bool disabled(expname e)
{
return statics().disabled[e];
}
#else
public:
static void disable(expname e) {
// nop - optimised away
}
static bool disabled(expname e)
{
// will be optimised away
return false;
}
#endif
};
}
using namespace std;
auto main() -> int
{
nsexp::checker::disable(nsexp::AMS2);
nsexp::checker::disable(nsexp::BESS2);
cout << nsexp::checker::disabled(nsexp::AMS1) << endl;
cout << nsexp::checker::disabled(nsexp::AMS2) << endl;
cout << nsexp::checker::disabled(nsexp::BESS1) << endl;
cout << nsexp::checker::disabled(nsexp::BESS2) << endl;
return 0;
}
如何定义可分配给枚举常量的保留值:
namespace nsexp{
enum expname{
AMS1 // = Undefined,
AMS2 // = Undefined,
BESS1= Undefined,
BESS2 // = Undefined,
...
};
}
if (BESS1 != Undefined) strcpy(filename[nsexp::BESS2],"bess/data_exp2");
您可以稍微修改
枚举
,并在任何引用之前检查值
#include <iostream>
enum expname {
// ENABLED
AMS1,
BESS1,
BESS2,
// DISABLED
DISABLED,
AMS2
};
bool enabled(expname exp) {
return (exp < expname::DISABLED);
}
int main(const int argc, const char* argv[]) {
std::cout << enabled(expname::AMS1) ? "enabled" : "disabled" << std::endl;
std::cout << enabled(expname::AMS2) ? "enabled" : "disabled" << std::endl;
return 0;
}
这需要在编译时完成,一个
if()
语句不会有帮助。我不确定是否有可能使用一些模板元编程技巧,但即使如此,这是否值得值得值得值得一试。auto
很好,但仅仅编写int main()
,不是更短吗?我有一个用于编写演示代码的skeleton.cpp文件。恰好main是这样定义的。您定义enum
的方式将导致编译错误,因为逗号放错了位置/丢失了。假设Undefined
为-1。这将使BESS2
等于未定义+1,因此AMS1
将等于BESS2
。显然不是你想要的。但无论如何,这是一个好主意。@shr:对,您还需要将标识符移到列表的末尾:(我添加了一个稍微不同的版本。
#include <iostream>
enum expname {
// ENABLED
AMS1,
BESS1,
BESS2,
// DISABLED
DISABLED,
AMS2
};
bool enabled(expname exp) {
return (exp < expname::DISABLED);
}
int main(const int argc, const char* argv[]) {
std::cout << enabled(expname::AMS1) ? "enabled" : "disabled" << std::endl;
std::cout << enabled(expname::AMS2) ? "enabled" : "disabled" << std::endl;
return 0;
}
enabled
disabled