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

ida*_*hmu 5 c++ enums unique

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

 typedef enum {
    et_general           = 0,
    et_INVALID_CLI_FLAG  = 1,
    ...
    et_undef = 500
  } EErrorType;
Run Code Online (Sandbox Code Playgroud)

我明确写入枚举值的主要原因是为了简化调试过程.
无论如何,我想知道是否有办法让编译器抱怨非唯一值.我总是可以在运行时轻松检查它,但我想避免这种情况.

我已经阅读了这篇文章并回顾了这个答案.据我了解,这个答案建议以这样的方式产生枚举,使其" 更容易犯错误 ".
我想保留enum定义,或者接近它.

pmr*_*pmr 5

我不确定你的场景中是否有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;
}
Run Code Online (Sandbox Code Playgroud)

如果将枚举定义更改为:

#define MYENUM ((FOO, 0))((BAR, 1))((BAZ, 2))((BAZZ, 2))
Run Code Online (Sandbox Code Playgroud)

你会得到一个错误说明static_assert failed "enum values not unique".


eug*_*nsk 5

可以编写一条虚拟switch语句,将枚举值作为标签 \xe2\x80\ x93保证它们的唯一性。放置在虚拟的未引用函数中,它不会进入可执行文件。

\n