自定义枚举底层类型

时间:2017-06-18 18:49:11

标签: c++ enums

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

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 ++,有没有办法让自定义类型作为整数类型传递?

2 个答案:

答案 0 :(得分:2)

  

<强>的std :: is_integral   检查T是否为整数类型。提供成员常量值,该值等于true,如果T是bool类型,charchar16_tchar32_twchar_t,{{1} },shortintlong或任何实现定义的扩展整数类型,包括任何有符号,无符号和cv限定的变体。否则,value等于false。

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

enumboolcharchar16_tchar32_twchar_tshortintlong

答案 1 :(得分:2)

  

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

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

例如,您可以使用

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以及有符号和无符号整数类型统称为整数类型。整数类型的同义词是整数类型。