是否存在可以使用的包含任何枚举值的整数类型

时间:2015-10-23 14:30:03

标签: c++

我需要执行一些代码static_cast<foo>(bar)其中foo是一个整数类型(简单地说,int),而bar是一个枚举值。< / p>

是否有一种类型可以用于foo 保证 static_cast对于 的任何枚举值有效任何枚举器?

3 个答案:

答案 0 :(得分:4)

是的,std::underlying_type_t<decltype(bar)>

如果您需要所有枚举的通用类型,那么union { intmax_t s; uintmax_t u;}。显然,在这种情况下使用哪两个成员取决于每个枚举类型的签名:

template<typename E> 
std::enable_if<std::is_signed<std::underlying_type_t<E>>::value, 
  intmax_t>::type foo( // ...

答案 1 :(得分:2)

<cstdint>中没有针对枚举的具体内容,但鉴于枚举必须是整数类型,您可以使用

intmax_t

如果您的枚举值为负值,或

uintmax_t

如果没有负值。

这两种类型被定义为系统中最宽泛的整数类型。遗憾的是,您需要单独处理未签名和签名的案件。没有任何类型适用于所有可能性。

答案 2 :(得分:1)

不,因为可能存在一些枚举类型xyx的基础类型为long longy的基础类型为{{} 1}}。

标准中没有适合所有unsigned long long signed unsigned值的类型。