是否有SFINAE测试来检查枚举是否未签名?

时间:2013-09-20 00:27:15

标签: c++ visual-studio c++11

实际上,我不确定使用operator<operator==以外的任何其他比较运算符是否有效,但我没有看到任何其他建议。所以假设这是有效的,有没有办法确定枚举是否有效使用SFINAE?

1 个答案:

答案 0 :(得分:3)

虽然

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

是便携式解决方案,但尚未在所有常用编译器中提供。从问题来看,目前尚不清楚您是否也在询问enum class,或仅仅是enum,但也许这种解决办法可以解决这个问题:

#include <iostream>
#include <iomanip>

enum S : int {};
enum U : unsigned {};
enum class SC : int {};
enum class UC : unsigned {};

template< typename E >
struct is_enum_signed {
    static const bool value = E(-1) < E(0);
};

int main()
{
    std::cout << std::boolalpha
              << is_enum_signed<S>::value << std::endl
              << is_enum_signed<U>::value << std::endl
              << is_enum_signed<SC>::value << std::endl
              << is_enum_signed<UC>::value << std::endl;
}

免责声明:我没有检查它是否符合标准,我只是想提供一种替代方案,您需要验证环境的适用性和正确性......