比较模板中的不同类型

use*_*942 5 c++ templates

我想创建一个函数来检查参数是否超出范围.

我写了这个:

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)

如何制作一个安全地处理所有类型的功能?

Col*_*oTV 1

正如@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)