我想创建一个函数来检查参数是否超出范围.
我写了这个:
template<typename X,typename Y,typename Z >
void checkParameter( X val, Y lower, Z upper)
{
if( ( val > upper) || ( val < lower) )
{
log("checkParameter, val = % , lower= % , upper= % \n", val,
lower,upper );
ASSERT(false);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做
uint32_t var = 5000;
checkParameter( var, 0, 262143);
Run Code Online (Sandbox Code Playgroud)
我收到警告:
warning: comparison between signed and unsigned integer expressions
Run Code Online (Sandbox Code Playgroud)
如何制作一个安全地处理所有类型的功能?
正如@Borisbn 所说,你可以这样做:
template<typename type >
void checkParameter( type val, type lower, type upper)
{
if( ( val > upper) || ( val < lower) )
{
log("checkParameter, val = % , lower= % , upper= % \n", val,
lower,upper );
ASSERT(false);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为你可以这样做:
template<bool A, bool B, bool C>
struct test {
template < typename T1, typename T2, typename T3>
void parameters (T1, T2, T3) { /* Mismatching types */ }
};
template<>
struct test<true, true, true> { // all parameters will be signed
template < typename T1, typename T2, typename T3>
void parameters (T1 a, T2 b, T3 c) {
/* do your test here */
}
};
template<>
struct test<false, false, false> { //all parameters will be unsigned
template < typename T1, typename T2, typename T3>
void parameters (T1 a, T2 b, T3 c) {
/* do your test here */
}
};
template < typename T1, typename T2, typename T3>
void testParameters(T1 a, T2 b, T3 c) {
test<std::is_signed<T1>::value, std::is_signed<T2>::value, std::is_signed<T3>::value>::parameters(a,b,c);
}
Run Code Online (Sandbox Code Playgroud)