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

时间:2014-03-24 06:33:37

标签: 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
    }
}


编辑。我正在使用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。我这样做是错误的,是否有更标准的兼容方式来拥有两个函数,一个用于返回无符号整数,另一个用于有符号积分?

2 个答案:

答案 0 :(得分:3)

哎呀...刚看到你的编辑...所以你正试图创建替代代码......这项工作在ideone demo here

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();
...

你想与VS2010分享并报告结果吗?

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

答案 1 :(得分:3)

我可能会使用标签调度:

namespace Detail
{
    template <typename T>
    T fooHelper(std::true_type /*isSignedTag*/)
    {
        //signed
    }
    template <typename T>
    T fooHelper(std::false_type /*isSignedTag*/)
    {
        //unsigned
    }
}
template <typename T>
T foo()
{
    return Detail::fooHelper<T>(typename std::is_signed<T>::type());
}