
一个用于未签名,另一个用于签名.有没有什么优雅的方式摆脱编译器警告而不压制它?
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 std::enable_if<std::is_signed<X>::value,aUpperlimit ); throw(std::out_of_range("InvalID Range")); }}解决方法 让我解释一下你在这里遇到的错误. 对于我来说,您通常希望对所有三个参数使用相同的类型.最直接的解决方案是这个定义:
template<typename X>voID deBUGValIDateParameter( X aValuetocheck,X aLowerlimit,X aUpperlimit){ if( (aValuetocheck > aUpperlimit) || (aValuetocheck < aLowerlimit) ) { log("ERROR: ValIDateParameters,aUpperlimit ); throw(std::out_of_range("InvalID Range")); }} 但是,如果然后使用无符号变量和两个文字整数来调用该函数,例如:
deBUGValIDateParameter(someUnsignedInteger,100);
您将收到一个错误,因为该类型不能推导出来 – 因此,所有类型为X的参数都需要传递一个完全相同类型的值.
所以推断X型是不明确的,因此是不可能的.对我来说,它看起来像是要根据传递的第一个参数(“实际值”)推导出类型,并且只是尝试将边界转换为同一类型.换句话说,一些不强迫你写的东西
deBUGValIDateParameter(someUnsignedInteger,0u,100u);
这可以通过禁用第二和第三参数的类型扣除来实现,通过将它们的类型指定为IDentity_t< X>而不是只有X,其中IDentity_t被定义为
template<typename T>struct IDentity { typedef T type; };template<typename T>using IDentity_t = typename IDentity<T>::type; 所以你的功能定义就变成了
template<typename X>voID deBUGValIDateParameter( X aValuetocheck,IDentity_t<X> aLowerlimit,IDentity_t<X> aUpperlimit){ if( (aValuetocheck > aUpperlimit) || (aValuetocheck < aLowerlimit) ) { log("ERROR: ValIDateParameters,aUpperlimit ); throw(std::out_of_range("InvalID Range")); }} 在这里可以看到Live Demo中的代码.
总结以上是内存溢出为你收集整理的c – 摆脱有符号和无符号整数表达式之间的比较的优雅方式全部内容,希望文章能够帮你解决c – 摆脱有符号和无符号整数表达式之间的比较的优雅方式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)