【发布时间】:2013-03-05 06:54:16
【问题描述】:
在讨论Incrementation and decrementation of “enum class” 之后,我想问一下enum class 类型的算术运算符的可能实现。
原始问题的示例:
enum class Colors { Black, Blue, White, END_OF_LIST };
// Special behavior for ++Colors
Colors& operator++( Colors &c ) {
c = static_cast<Colors>( static_cast<int>(c) + 1 );
if ( c == Colors::END_OF_LIST )
c = Colors::Black;
return c;
}
有没有一种方法可以实现算术运算符,而无需转换为已定义运算符的类型?我想不出来,但选角让我很困扰。演员表通常表明有问题,并且必须有一个很好的理由来使用它们。我希望该语言允许在不强制使用特定类型的情况下实现运算符的实现。
2018 年 12 月更新: 其中一篇针对 C++17 的论文似乎通过允许枚举类变量和基础类型之间的转换至少部分解决了这个问题:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf
【问题讨论】:
-
“演员表通常表明有问题”......演员表是可以使用的。有时,显式转换比让编译器假设它想要的任何东西更好。
-
@icepack:你是不想做简单明了的演员表的人。你是那种认为必须在某些有限的情况下进行施法是一种语言缺陷的人。因此,您将不得不承受其后果。
-
@icepack: "我没有理由在语言中提供一个没有完整有效操作的完整构造" 如果你想要这些构造,你不应该使用
enum class。这样做的全部目的是不可以隐式转换为整数。 不将其视为整数类型。因此,如果要对其执行某些整数运算,则必须自己定义。 -
@icepack: "但它会在未来被咬掉。" 不,它不会;那是教条主义的想法。您只是在某些、特定和孤立的位置进行演员表。
-
"通过使用强制转换,我可以将
enum class的所有优势降低到原来的enum"——不。enum class的优点是它不会隐式转换为整数类型,而不是不能转换为整数类型。当您想将给定的enum class视为一个整数类型时,您可以这样做,并且可以在您的enum class接口中明确地这样做。是的,在语言中添加迭代元素和类似的支持将是一件好事,但是添加了enum class,因为它既有用又容易。
标签: c++ c++11 operator-overloading enum-class