就像 Matthieu 所说的那样,这样做是完全安全的,并且不会以任何方式违反 C++ 标准。
作为旁注,在枚举上重载 ++ 运算符不仅是一种矫枉过正,而且其他人已经说明了一些问题(例如,如果枚举的值不是线性的)
因此,您需要的是迭代器,而不是定义运算符 ++。
我从这里通过 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;
}
}
这对你来说可能仍然是一个过度杀伤,但它更干净。另一段代码,但更优雅的方法是here。将来 C++11 中引入的枚举类可能在标准中具有迭代器。
更新:由于您向我们更新了您的值是连续的,并且 C API 需要它(?),因此上述内容不适合