是否可以手动定义枚举类的转换?

Omn*_*ity 42 c++ enums c++11 enum-class

通常,您可以使用以下语法为类定义强制转换:

class Test {
public:
  explicit operator bool() { return false; }
};
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点或类似的东西enum class

Mat*_* M. 21

不,这不对.

实际上,enum class根本就没有课程.该class关键字仅使用,因为突然改变无范围enum到范围enum必须返工意味着所有枚举代码.因此委员会决定区分新风格和旧风格的枚举,新标记将被标记class,因为它已经是一个关键字,所以没有用C++ enum命名class.他们本可以选择另一个,无论如何都不会有更多的意义.

但是,尽管class关键字仍然是常规枚举,但只允许在括号内使用枚举器(以及分配给它们的可能值).

  • `enum class`最初使用的是C++/CLI几乎相同的语义.标准采用现有语法并对其进行标准化. (6认同)
  • 说得通.太糟糕了C++/CLI没有使用`enum namespace`,但它就是这样. (6认同)

Ben*_*igt 16

不,但你可以使用constexpr成员和构造函数使普通的类类型像枚举类一样.然后,您可以添加所需的所有其他成员函数.

  • C++ 努力提供高级功能,同时保持对机器的直接访问(“更好的汇编语言”)。设计者已经多次说过,C++ 是多范式的。“switch”是对跳转表的直接访问,就像在 C 中一样。系统编程语言*应该*具有直接访问权限。我认为,如果有一天 C++ 确实添加一些模式匹配运算符,那就太好了,但如果他们为此使用“switch”关键字,那将是一个可怕的错误。 (2认同)

imr*_*eal 5

您无法在 C++ 中定义非成员强制转换运算符。而且您当然不能为枚举定义成员函数。因此,我建议您使用自由函数将枚举转换为其他类型,就像实现强制转换运算符一样。

例如

bool TestToBool(enum_e val)
{
    return false;
}

const char *TestToString(enum_e val)
{
    return "false";
}
Run Code Online (Sandbox Code Playgroud)

有一种很好的方法可以将这些枚举与布尔值关联起来,您必须将其拆分为两个文件 .h 和 .cpp。这是如果有帮助的话:

枚举.h

///////////////////////////////
// enum.h
#ifdef CPP_FILE
#define ENUMBOOL_ENTRY(A, B)            { (enum_e) A, (bool) B },
struct EnumBool
{
    enum_e  enumVal;
    bool    boolVal;
};
#else
#define ENUMBOOL_ENTRY(A, B)            A,
#endif


#ifdef CPP_FILE
static EnumBool enumBoolTable[] = {
#else
enum enum_e
{
#endif
ENUMBOOL_ENTRY(ItemA, true),
ENUMBOOL_ENTRY(ItemB, false),
...
};

bool EnumToBool(enum_e val);
Run Code Online (Sandbox Code Playgroud)

枚举.cpp

///////////////////////////////
// enum.cpp
#define CPP_FILE
#include "enum.h"

bool EnumToBool(enum_e val)
    //implement
Run Code Online (Sandbox Code Playgroud)

我没有编译它,所以如果有任何错误,请放心:)。

  • 挑剔:“TestToString”应该返回“std::string” (5认同)
  • 挑剔:“TestToString”应该返回一个“const char*”。 (2认同)