2017-06-18 147 views
5

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

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

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

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

例如,你可以使用

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

+0

因此,在这种情况下的“整数类型”与“的std :: is_integral'? – Nelfeal

+0

您发布的示例将颠覆“std :: is_integral”的意图。我不确定在语言中是否有任何东西来阻止这种情况发生。 –

+3

[看起来像''中的任何东西都是未定义的行为。](https://stackoverflow.com/questions/8513417/what-c​​an-and-cant-i-specialize-in-the-std-namespace)。我应该看得更彻底。另外[this](https://stackoverflow.com/questions/25345486/why-specializing-a-type-trait-could-result-in-undefined-behaviour)(感谢HolyBlackCat)。 – Nelfeal

2

的std :: is_integral 检查T是否为一个整数类型。提供构件的恒定值,它等于真,如果T是bool类型,charchar16_tchar32_twchar_tshortintlonglong long,或任何实现所定义的扩展整型,包括任何符号,无符号,和符合cv标准的变体。否则,值等于假。

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

boolcharchar16_tchar32_twchar_tshortintlonglong long

+0

[这并不意味着你不能专注'is_integral'](http://coliru.stacked-crooked.com/a/b9828b8eaf4d59e3) – Nelfeal

+0

我不相信我写的任何违背。 – Shiro

+0

@Nelxiost你有它向后。 'std :: is_integral'指示一个类型是否是整数,由标准和实现定义。专注于std ::'的东西是(通常)UB – Caleth