std :: is_signed不适用于强类型枚举:int

时间:2015-10-27 09:22:21

标签: c++ c++11 enums

任何人都可以解释,为什么

var oficinas = (ViewModel as CrdMovil.Core.ViewModels.OficinaViewModel).Oficinas;

的std :: is_signed<>什么不做,它在锡上说的是什么? 感谢...

2 个答案:

答案 0 :(得分:7)

如果我们查看is_signed的文档,则说:

  

如果 T是带符号的算术类型,则提供成员常量值等于true。对于任何其他类型,值为false。

并且枚举不是算术类型,因此结果应为false。从草案C ++ 11标准部分3.9.1基本类型[basic.fundamental]:

  

[...]积分和浮动类型统称为算术   类型[...]

您可以使用std::underlying_type获取枚举的基础类型,然后将std::is_signed应用于该类型。

答案 1 :(得分:2)

对于记录,要知道强类型枚举的基础类型(即,不是枚举本身,can't be检查签名)是否已签名,可以查询std::underlying_type<E>::type

std::is_signed<std::underlying_type<E>::type>::value

或定义自己的特质:

#include <type_traits>

template <typename T>
struct identity { using type = T; };

template <typename T>
struct is_signed
    : std::is_signed<typename std::conditional<std::is_enum<T>::value
                                             , std::underlying_type<T>
                                             , identity<T>>::type::type> {};

DEMO