我有一个具有两个值的枚举类,我想创建一个接收一个值并返回另一个值的方法。我还想维护类型安全(这就是我使用枚举类而不是枚举的原因)。
http://www.cplusplus.com/doc/tutorial/other_data_types/没有提到任何关于方法的东西,但是,我的印象是任何类型的类都可以有方法。
发布于 2014-01-23 07:09:01
不,他们不能。
我可以理解,C++11中强类型枚举的enum class
部分似乎暗示您的enum
也具有class
特征,但事实并非如此。我有根据的猜测是,关键字的选择受到了我们在C++11之前用于获取作用域枚举的模式的启发:
class Foo {
public:
enum {BAR, BAZ};
};
然而,这只是语法。再说一次,enum class
不是class
。
发布于 2018-11-13 23:13:02
虽然“你不能”的答案在技术上是正确的,但我相信你可以使用以下想法来实现你正在寻找的行为:
我假设你想要写下这样的代码:
Fruit f = Fruit::Strawberry;
f.IsYellow();
您希望代码看起来像这样:
enum class Fruit : uint8_t
{
Apple,
Pear,
Banana,
Strawberry,
bool IsYellow() { return this == Banana; }
};
但当然,它不能工作,因为枚举不能有方法( 'this‘在上面的上下文中没有任何意义)
但是,如果使用包含非类枚举的普通类和包含该类型的值的单个成员变量的概念,则可以非常接近所需的语法/行为/类型安全性。即:
class Fruit
{
public:
enum Value : uint8_t
{
Apple,
Pear,
Banana,
Strawberry
};
Fruit() = default;
constexpr Fruit(Value aFruit) : value(aFruit) { }
#if Enable switch(fruit) use case:
// Allow switch and comparisons.
constexpr operator Value() const { return value; }
// Prevent usage: if(fruit)
explicit operator bool() = delete;
#else
constexpr bool operator==(Fruit a) const { return value == a.value; }
constexpr bool operator!=(Fruit a) const { return value != a.value; }
#endif
constexpr bool IsYellow() const { return value == Banana; }
private:
Value value;
};
现在你可以写下:
Fruit f = Fruit::Strawberry;
f.IsYellow();
编译器会阻止类似这样的事情发生:
Fruit f = 1; // Compile time error.
您可以很容易地添加这样的方法:
Fruit f("Apple");
和
f.ToString();
可以被支持。
发布于 2017-02-19 05:52:11
专注于问题的描述而不是标题,一个可能的答案是
struct LowLevelMouseEvent {
enum Enum {
mouse_event_uninitialized = -2000000000, // generate crash if try to use it uninitialized.
mouse_event_unknown = 0,
mouse_event_unimplemented,
mouse_event_unnecessary,
mouse_event_move,
mouse_event_left_down,
mouse_event_left_up,
mouse_event_right_down,
mouse_event_right_up,
mouse_event_middle_down,
mouse_event_middle_up,
mouse_event_wheel
};
static const char* ToStr (const type::LowLevelMouseEvent::Enum& event)
{
switch (event) {
case mouse_event_unknown: return "unknown";
case mouse_event_unimplemented: return "unimplemented";
case mouse_event_unnecessary: return "unnecessary";
case mouse_event_move: return "move";
case mouse_event_left_down: return "left down";
case mouse_event_left_up: return "left up";
case mouse_event_right_down: return "right down";
case mouse_event_right_up: return "right up";
case mouse_event_middle_down: return "middle down";
case mouse_event_middle_up: return "middle up";
case mouse_event_wheel: return "wheel";
default:
Assert (false);
break;
}
return "";
}
};
https://stackoverflow.com/questions/21295935
复制相似问题