测试std :: is_integral和std :: is_signed?

loo*_*oop 5 c++ templates c++11

我有一个函数,但我想将它分成两个函数,一个用于返回有符号整数,另一个用于无符号整数.它看起来std::is_signed不是严格的整数所以我想如果我可以模板测试的东西,std::is_integral<T>::value && std::is_signed<T>::value但这不起作用.现在我将签名测试作为if语句:

template<typename T>
typename std::enable_if
<
    std::is_integral<T>::value,
    T
>::type
foo()
{
    if( std::is_signed<T>::value )
    {
        //signed
    }
    else
    {
        //unsigned
    }
}
Run Code Online (Sandbox Code Playgroud)


编辑.我正在使用Visual Studio 2010.实际上看起来发生的事情是Visual Studio不会接受两个模板,一个带有std::is_integral<T>::value && std::is_signed<T>::value,一个带有std::is_integral<T>::value && std::is_unsigned<T>::value.它告诉我function template has already been defined.我这样做是错误的,是否有更标准的兼容方式来拥有两个函数,一个用于返回无符号整数,另一个用于有符号积分?

Ton*_*roy 3

哎呀...刚刚看到您的编辑...所以您正在尝试创建替代代码...这在ideone 演示中工作:

template <typename T>
typename std::enable_if<std::is_integral<T>::value && std::is_signed<T>::value,
                        int>::type f();


template <typename T>
typename std::enable_if<std::is_integral<T>::value && !std::is_signed<T>::value,
                        unsigned>::type f();
...
Run Code Online (Sandbox Code Playgroud)

您想用 VS2010 尝试一下并报告结果吗?

或者,您可以std::conditional结合if问题代码中的语句来执行此操作 - 未使用的代码将在编译时被优化掉)。