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