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.我这样做是错误的,是否有更标准的兼容方式来拥有两个函数,一个用于返回无符号整数,另一个用于有符号积分?
哎呀...刚刚看到您的编辑...所以您正在尝试创建替代代码...这在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问题代码中的语句来执行此操作 - 未使用的代码将在编译时被优化掉)。