在c++中迭代连续枚举值的最简单方法
Simplest method for iterating through contiguous enum values in C++
在c++中迭代具有连续值的枚举时,首选的简单方法是什么?我发现之前关于这个主题的SO问题涉及创建自定义operator++
等,但这似乎有点过头了。到目前为止,我想到的最好的是:
enum {
FOO,
BAR,
BLECH,
NUM_ENUMS
} MyEnum;
//for (MyEnum m = FOO; m < NUM_ENUMS; ++m) // compile error
// ...
//for (MyEnum m = FOO; m < NUM_ENUMS; m = m + 1) // compile error
// ...
for (MyEnum m = FOO; m < NUM_ENUMS; m = MyEnum(m + 1)) // OK ?
...
从编码风格的角度来看,这是合理的吗?它是否可能产生警告(g++ -Wall ...
似乎对此感到高兴)?
确实安全。
这将是未定义的:MyEnum(int(NUM_ENUMS) + 1)
,因为要保存的值(4)将大于enum所能表示的值([0,3]);因为你确保m
严格低于NUM_ENUMS
,所以使用MyEnum(m + 1)
是安全的。
enum OtherEnum {
Foo = -1,
Bar = 2,
Baz = 8,
NUM_OTHERENUM
};
所以这不是一个通用的做法。
我建议对生成的数组进行迭代:
MyEnum const Values[] = { FOO, BAR, BLECH };
请注意,它很容易从枚举的定义中生成,并且还可以避免使用无意义的值(业务方面)污染接口。
就像Matthieu说的那样,这样做是完全安全的,并且不会以任何方式违反c++标准。
作为旁注,在enum上重载++操作符不仅是多余的,而且存在其他人已经声明的问题(例如,如果enum的值不是线性的)
因此,您需要的不是定义操作符++,而是定义一个迭代器。
对于deft_code中的枚举,我采用了下面的解决方案,但稍微针对您的示例进行了调整。
template< typename T >
class Enum
{
public:
class Iterator
{
public:
Iterator( int value ) :
m_value( value )
{ }
T operator*( void ) const
{
return (T)m_value;
}
void operator++( void )
{
++m_value;
}
bool operator!=( Iterator rhs )
{
return m_value != rhs.m_value;
}
private:
int m_value;
};
};
template< typename T >
typename Enum<T>::Iterator begin( Enum<T> )
{
return typename Enum<T>::Iterator( (int)T::First );
}
template< typename T >
typename Enum<T>::Iterator end( Enum<T> )
{
return typename Enum<T>::Iterator( ((int)T::Last) + 1 );
}
enum class MyEnum
{
FOO,
BAR,
BLECH,
NUM_ENUMS
};
int main()
{
for( auto e: Enum<MyEnum>() )
{
std::cout << ((int)e) << std::endl;
}
}
这对你来说可能仍然是多余的,但它更干净。另一段代码,但更优雅的方法在这里。将来c++ 11中引入的枚举类有可能在标准中包含一个迭代器。
update:由于您更新了我们,您的值是连续的,并且它是C API(?)所需的事实,那么以上将不适合
相关文章:
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 将时间戳打印到流的最简单方法
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- boost::variant - 对变体应用算术的最简单方法
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 在C++中将算术类型转换为 std::array 的最简单方法<uint8_t>
- C++-将ASCII字符数组中可能的数值转换为字符的最简单方法
- 从 txt 文件中读取数据的最简单方法
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 对于我扩展此程序来计算最高10x10矩阵的倒数的最简单方法是什么
- C++98 中获取并继续调用当前类不知道的类方法的最简单方法是什么?
- 编写要在 Python 中使用的并行 C/C++ 模块的最简单方法
- 开放式颜色多边形表面的最简单方法
- 确定代码中当前程序集是否为 32/64 位的最简单方法
- 将unique_ptr存储在堆上的最简单方法是什么
- 使用 C# 获取 OpenGL 版本的最简单方法
- 在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?
- 为depth_first_search定义颜色图的最简单方法