我有以下模板:
一个用于无符号,另一个用于签名 . 是否有任何优雅的方法来摆脱编译器警告而不抑制它?
warning: comparison between signed and unsigned integer expressions
我是否需要为每种类型编写函数,例如uint8,uint16等..?
template<typename X,typename Y,typename Z, typename std::enable_if<std::is_unsigned<X>::value, bool>::type = true >
void debugValidateParameter( X aValueToCheck, Y aLowerLimit, Z aUpperLimit)
{
if( (aValueToCheck > aUpperLimit) || (aValueToCheck < aLowerLimit) )
{
log("ERROR: ValidateParameters, aValueToCheck = % , aLowerLimit= % , aUpperLimit= % \n", aValueToCheck, aLowerLimit, aUpperLimit );
throw(std::out_of_range("Invalid Range"));
}
}
template<typename X,typename Y,typename Z, typename std::enable_if<std::is_signed<X>::value, bool>::type = true >
void debugValidateParameter( X aValueToCheck, Y aLowerLimit, Z aUpperLimit)
{
if( (aValueToCheck > aUpperLimit) || (aValueToCheck < aLowerLimit) )
{
log("ERROR: ValidateParameters, aValueToCheck = % , aLowerLimit= % , aUpperLimit= % \n", aValueToCheck, aLowerLimit, aUpperLimit );
throw(std::out_of_range("Invalid Range"));
}
}
3 回答
让我解释一下你在这里遇到的问题 .
对我来说,看起来您通常希望对所有三个参数使用相同的类型 . 最直接的解决方案是这个定义:
但是,如果您随后使用无符号变量和两个文字整数调用该函数,例如:
你会得到一个错误,因为无法推断出类型 - 为此,所有类型为
X
的参数都需要传递一个完全相同类型的值 . 因此,推断类型X
是不明确的,因此是不可能的 . 对我来说,看起来你想要根据传递的第一个参数("actual value")推断出类型,并且只是尝试将边界转换为相同的类型 . 换句话说,一些不会强迫你写的东西这可以通过禁用第二个和第三个参数的类型推导来完成,方法是将它们的类型指定为
identity_t<X>
而不是X
,其中identity_t
定义为那么你的函数定义就变成了
在这里,您可以看到Live Demo中的代码 .
您不需要SFINAE或专业化,您只需要
X
,Y
,Z
具有相同的符号 . 所以你可以使用但这需要将所有参数推导为相同类型 .
为了避免这种情况,你可以强迫某些论证是不可推论的:
这样的事怎么样?