"毫无意义的比较"带有特定值的模板中的警告

时间:2016-07-07 21:09:57

标签: c++ templates compiler-warnings

我有一个模板化(CUDA,虽然适用于C ++)函数(我已经简化了这一点),如下所示:

template<unsigned windowsize>
__global__ void someFunc()
{
    if (threadIdx.x < (32 - windowsize * 2))
    {
       // ... something exciting
    }
}

我使用&#34; windowsize&#34;设置为1-16。在Visual Studio 2013中使用nvcc进行编译,我收到以下警告:

warning : pointless comparison of unsigned integer with zero

这显然适用于windowsize = 16的情况(if语句的计算结果为threadIdx.x&lt; 0,即为false),因此警告确实有意义。

我看过类似的问题: How to silence a particular "pointless comparison of unsigned with zero" warning?但是在使用typedef而不是模板的情况下,这些答案并不合适。

是否有更好的方法来构建此功能,在没有警告的情况下提供相同的功能?我可以创建单独的函数来处理windowsize大于或小于16的不同,但实际上函数更复杂,我觉得我不必要地复制和复杂代码,这是使用模板的全部要点开头。

3 个答案:

答案 0 :(得分:2)

显而易见的方法是将比较分解为一个单独的函数:

template <unsigned WindowSize>
bool doSomethingExciting() { return threadIdx.x < (32u - WindowSize * 2u); }
template <>
bool doSomethingExciting<16>() { return false; }

template<unsigned windowsize>
__global__ void someFunc()
{
    if (doSomethingExciting<windowsize>())
    {
       // ... something exciting
    }
}

答案 1 :(得分:1)

您可以尝试使用16:

的模板功能
template<unsigned windowsize>
__global__ void someFunc()
{
    //...
    std::cout << "called for windowsize " << windowsize << '\n';
}

template<>
__global__ void someFunc<16>()
{
    //...
    std::cout << "specialized for windowsize 16" << '\n';
}

void foo()
{
    someFunc<4>();
    someFunc<16>()
}

Live example

如果有通用代码,您可以将其分解并创建一个单独的函数,常规版本和专用版本都将调用。

答案 2 :(得分:0)

您可能希望执行两个测试,其中第一个应在编译时执行:

template<unsigned windowsize>
__global__ void someFunc()
{
    if (windowsize < 16)
    {
       if ((int)threadIdx.x < (int)(32 - windowsize * 2))
       {
          // ... something exciting
       }
    }
}