我需要执行一些代码static_cast<foo>(bar)
其中foo
是一个整数类型(简单地说,int
),而bar
是一个枚举值。< / p>
是否有一种类型可以用于foo
保证 static_cast
对于 的任何枚举值有效任何枚举器?
答案 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)
不,因为可能存在一些枚举类型x
和y
,x
的基础类型为long long
而y
的基础类型为{{} 1}}。
标准中没有适合所有unsigned long long
和 signed
unsigned
值的类型。