c++:确保枚举值在编译时是唯一的

标签 c++ enums unique

我有以下描述错误代码的 enum:

 typedef enum {
    et_general           = 0,
    et_INVALID_CLI_FLAG  = 1,
    ...
    et_undef = 500
  } EErrorType;

我显式写入枚举值的主要原因是为了简化调试过程。
不管怎样,我想知道是否有办法让编译器提示非唯一值。 我总是可以在运行时轻松检查它,但我想避免这种情况。

我读过这个post并审查了这个answer .据我了解,该答案建议以“使犯错变得更加困难”的方式生成枚举。
我想保留枚举定义,或者接近它。

最佳答案

我不确定 Boost 在您的场景中是否可用,所以这是一个解决方案,其中 enum 必须在预处理器序列中定义。然后该序列用于构建枚举和相应的 mpl::vector,我们计算 vector 的元素是否以一种奇怪的方式是唯一的。我们可能想先定义一个合适的 is_unique 算法,但这应该可以。

#include <boost/mpl/vector.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/sort.hpp>
#include <boost/mpl/unique.hpp>
#include <boost/mpl/size.hpp>

#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/transform.hpp>


#define MYENUM ((FOO, 0))((BAR, 1))((BAZ, 2))

#define GET_NAME(_, __, elem) BOOST_PP_TUPLE_ELEM(2, 0, elem) = BOOST_PP_TUPLE_ELEM(2, 1, elem)
#define GET_VALUE(_, __, elem) boost::mpl::int_<BOOST_PP_TUPLE_ELEM(2, 1, elem)>

enum E {
  BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(GET_NAME, _, MYENUM))
};

typedef boost::mpl::sort< 
  boost::mpl::vector<
    BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TRANSFORM(GET_VALUE, _, MYENUM))
    > 
  >::type evalues;

typedef boost::mpl::unique< evalues, boost::is_same<boost::mpl::_1, boost::mpl::_2> >::type uniqued;
static_assert(boost::mpl::size<uniqued>::value == boost::mpl::size<evalues>::value, "enum values not unique");

int main()
{

  return 0;
}

如果将枚举定义更改为:

#define MYENUM ((FOO, 0))((BAR, 1))((BAZ, 2))((BAZZ, 2))

您将收到一条错误消息,指出 static_assert 失败“枚举值不唯一”

关于c++:确保枚举值在编译时是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21378938/

相关文章:

c++ - 大小为 N 和 N 的所有排列不一定等于数组的大小

C# 枚举范围。仅在函数中可见

java - 将属性从数据库加载到枚举

java - 计算字符串中的唯一字符

java - JNI 使用。 "symbol lookup error"

C++ - 使用 typeof 运算符的宏给出错误

Java如何获得每个枚举的所有值的总和

c# - 如何生成唯一的 8 位数字?

php - 如何使用 codeigniter 生成 5 位字母数字唯一 ID?

c++ - 有没有像 "#pragma ignore this sourcefile"这样的 MSVC 编译器?