02 February 2023

C++ 核心指南目录

“Define operations on enumerations for safe and simple use”

理由

使用习惯,避免错误。

例子

enum class Day { mon, tue, wed, thu, fri, sat, sun };

Day& operator++(Day& d)
{
    return d = (d == Day::sun) ? Day::mon : static_cast<Day>(static_cast<int>(d)+1);
}

int main()
{
    Day today = Day::sat;
    Day tomorrow = ++today;
    cout << static_cast<int>(tomorrow);
}
6

这里用了statc_cast看起来不太优美。但是:

Day& operator++(Day& d)
{
    return d = (d == Day::sun) ? Day::mon : Day{++d};    // error
}

这里++的使用,会导致无限递归。要么使用 switch 实现,但这样代码又太多。

强化

  • 标记重复的转换回枚举的表达式。