在讨论了问题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;
}
有没有办法实现算术运算符而不转换为已定义运算符的类型?我想不出任何东西,但是铸造困扰着我 . 演员通常表示出现了错误,并且必须有充分的理由让他们使用 . 我希望语言允许在不强制使用特定类型的情况下实现运算符 .
Update Dec 2018 :其中一篇针对C17的论文似乎至少部分地通过允许枚举类变量和基础类型之间的转换来解决这个问题:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf
3 回答
无投射解决方案是使用开关 . 但是,您可以使用模板生成伪开关 . 原理是使用模板列表(或参数包)递归处理枚举的所有值 . 所以,我找到了3种方法 .
测试枚举:
香草开关(住在这里):
C 03-ish方法(住在这里):
C 11-ish方法(住在这里):
(C++11-ish old version)
您可以通过添加一些预处理器来扩展,以消除重复值列表的需要 .
枚举中C中的每个运算符都可以在不转换为基础类型的情况下编写,但结果可能会非常冗长 .
举个例子:
并且智能编译器将能够将这些转换为直接在基本积分类型上的操作 .
但是在
enum class
的界面中转换为基本积分类型并不是一件坏事 . 操作员是enum class
界面的一部分 .如果你不喜欢循环通过
size_t
并认为它是假演员,你可以写:并且类似地用于递减,并且实现递增
n
作为重复increment
的循环 .Check in C++ Shell