我有一个函数,但我想把它分成两个函数,一个用于返回有符号整数,另一个用于无符号整数。看起来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
。我这样做是错误的,是否有更标准的兼容方式来拥有两个函数,一个用于返回无符号整数,另一个用于有符号积分?
答案 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());
}