【问题标题】:Custom enum underlying type自定义枚举基础类型
【发布时间】:2017-06-18 18:49:10
【问题描述】:

我可以定义一个类型作为枚举的基础类型吗?像这样的:

struct S {
    S(int i) : value(i) {}
    operator int() { return value; }

    int value;
};

enum E : S {
    A, B, C
};

错误信息告诉我 S 必须是整数类型。我试图像下面这样专门化std::is_integral,但似乎在这种情况下,“整数类型”确实意味着基本类型之一。

namespace std {
    template<>
    struct is_integral<S> : public true_type {};
}

那么,使用任何版本的 C++,有没有办法让自定义类型作为整数类型传递出去?

【问题讨论】:

    标签: c++ enums


    【解决方案1】:

    我可以定义一个类型以用作枚举的基础类型吗?

    您只能使用整数类型来定义enums,而不是任何旧类型。

    例如,你可以使用

    enum E : char {
        A, B, C
    };
    

    表示E 的值将是char 类型。但是你不能用

    enum E : S {
        A, B, C
    };
    

    来自C++11 Standard, 3.9.1/7

    boolcharchar16_tchar32_twchar_t 类型以及有符号和无符号整数类型统称为整数类型。整数类型的同义词是整数类型。

    【讨论】:

    【解决方案2】:

    std::is_integral 检查 T 是否为整数类型。提供等于 true 的成员常量值,如果 T 是类型 boolcharchar16_tchar32_twchar_tshortintlong、@987654332 @,或任何实现定义的扩展整数类型,包括任何有符号、无符号和 cv 限定的变体。否则,值等于 false。

    这是here 的摘录。 这意味着enum 必须使用以下类型之一:

    boolcharchar16_tchar32_twchar_tshortintlonglong long

    【讨论】:

    猜你喜欢
    • 2016-11-30
    • 2011-09-11
    • 2019-06-15
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2012-03-09
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多