我有一个有两个值的枚举类,我想创建一个接收一个值并返回另一个值的方法。我还想维护类型安全(这就是为什么我使用枚举类而不是枚举)。
http://www.cplusplus.com/doc/tutorial/other_data_types/没有提到任何关于方法的内容,然而,我的印象是任何类型的类都可以有方法。
我有一个有两个值的枚举类,我想创建一个接收一个值并返回另一个值的方法。我还想维护类型安全(这就是为什么我使用枚举类而不是枚举)。
http://www.cplusplus.com/doc/tutorial/other_data_types/没有提到任何关于方法的内容,然而,我的印象是任何类型的类都可以有方法。
8条答案
按热度按时间zpjtge221#
不,他们不能。
我可以理解C11中强类型枚举的
enum class
部分似乎暗示了enum
也具有class
特性,但事实并非如此。我有根据的猜测是,关键字的选择受到了C11之前用于获取作用域枚举的模式的启发:但是,这只是语法问题,同样,
enum class
不是class
。mcvgt66p2#
虽然“你做不到”的答案在技术上是正确的,但我相信你可以通过以下方法实现你想要的行为:
我想你会想写这样的东西:
你希望代码看起来像这样:
但是当然,它不起作用,因为枚举不能有方法(并且“this”在上面的上下文中没有任何意义)
然而,如果您使用包含非类枚举的普通类和包含该类型值的单个成员变量的思想,您可以非常接近您想要的语法/行为/类型安全。例如:
现在你可以写:
编译器将防止以下情况:
您可以轻松地添加方法,例如:
以及
可以被支撑。
92vpleto3#
专注于问题的描述而不是题目,一个可能的答案是
ncgqoxb04#
有一个非常兼容的能力(§)可以将枚举重构为类,而不必重写代码,这意味着有效地,您可以做您要求做的事情,而无需过多编辑。
(§)* 正如ElementW在注解中指出的,type_traits依赖代码将无法工作,因此,例如,不能使用auto等。可能有一些方法可以处理这些东西,但最终将枚举转换为类,颠覆C++* 总是一个错误
enum struct
和enum class
规范是关于作用域的,所以不是它的一部分。你原来的枚举是例如'pet'(这只是一个例子!)
(1)将其修改为例如petEnum(以便在现有代码中隐藏它)。
(2)在它下面添加一个新的类声明(用原始枚举命名)
(3)现在你可以添加任何你喜欢的类方法到你的宠物类中。例如,一个字符串操作符
现在您可以使用例如std::cout...
9rbhqvlz5#
正如在other answer中提到的,不,甚至
enum class
也不是一个类。通常,需要为
enum
提供方法是因为它不是一个 * 常规 *(只是递增)枚举,而是一种要屏蔽的值的逐位定义,或者需要其他位算术运算:显然,考虑通过例如位掩码值或甚至位索引驱动的操作来封装重置/设置单个/组位所必需的操作对于操纵这样一组“标志”将是有用的。
c++11
struct
/class
specification只是支持更好的枚举值的作用域来访问。摆脱不能为枚举(类)声明方法的限制的方法是,要么使用
std::bitset
( Package 类),要么使用bitfieldunion
。union
s,并且这样的位域联合可以具有方法(有关限制,请参见here!)。我有一个示例,如何将位掩码值(如上所示)转换为相应的位索引,可以在这里与
std::bitset
一起使用:BitIndexConverter.hpp我发现这对于增强一些基于“标志”决策的算法的可读性非常有用。
nzk0hqpo6#
它可能无法满足您的所有需求,但与非会员运营商合作,您仍然可以获得很多乐趣。例如:
这允许代码如下
yb3bgrhw7#
基于jtlim's answer
想法(解决方案)
用法
t2a7ltrp8#
是的,它们可以,但是您需要创建一个 Package 类,例如: