1

所以考虑这个结构:

struct CType
{
    enum DType
    {
        Int,
        Char
    } Type;

    union Value
    {
        int num;
        char alpha;

        Value() {
            this->num = 0;
            this->alpha = '\0';
        };
        ~Value() {};
    } value;
};

我怎样才能做到这一点?

CType u3;
u3.Type = CType::Int;

为什么上述工作?

我会这样做:

u3.Type = CType::DType::Int;

提前致谢。

4

2 回答 2

3

DType是在其封闭范围内可见的无范围枚举:

无范围枚举(强调我的) - C++11 之前的:

每个枚举器都成为枚举类型(即名称)的命名常量,在封闭范围内可见,并且可以在需要常量时使用。

您正在寻找Scoped Enumeration(自 C++11 起可用):

每个枚举器都成为枚举类型(即名称)的命名常量,包含在枚举范围内,并且可以使用范围解析运算符进行访问。没有从作用域枚举器的值到整数类型的隐式转换,尽管可以使用 static_cast 来获取枚举器的数值。

请参阅文档:https ://en.cppreference.com/w/cpp/language/enum

因此,DType作为 Scoped Enumeration 将是:

enum class DType { Int, Char };

并且,Int可以像这样访问它:

DType::Int
于 2020-05-18T13:48:31.953 回答
2

从历史上看,这就是枚举的工作方式。

编写“枚举类”而不是“枚举”,您将获得更高的安全性和所需的访问语法。

于 2020-05-18T13:40:36.170 回答