删除C ++模板类中的性能警告

时间:2012-02-20 15:39:37

标签: c++ visual-studio templates boost compiler-warnings


我想在模板类的函数中删除浮动到bool转换性能警告,在这种情况下boost::enable_if感觉有点矫枉过正。

有没有办法在编译时检查模板的类型,然后根据类型使用适当的强制转换?

    T val;
    float val2;
    val = (T)(val+val2); // warning here for objects of type bool


我想要这样的东西:

    #if (boost::is_same<CType, bool>::value == true)
        val = (val+val2)!=0;
    #else
        val = (T)(val+val2);
    #endif


我不想只是禁用警告。

编辑:添加了visual studio标签

2 个答案:

答案 0 :(得分:6)

您可以将操作拉出到单独的模板中,并为bool重载:

template <typename T1, typename T2>
T1 add(T1 const & v1, T2 const & v2) {
    return static_cast<T1>(v1 + v2);
}

template <typename T2>
bool add(bool v1, T2 const & v2) {
    return (v1 + v2) != 0;
}

T val;
float val2;
val = add(val,val2); // hopefully no warning now.

答案 1 :(得分:2)

只需将is_same与if-block一起使用即可专业化&#39;对于布尔。它是标准库的一部分,如果你不想使用Boost的话。

template<typename T>
void foo(T val1) {
    T val;
    float val2;

    if (std::is_same<T, bool>::value == true)
        val = (val1 + val2) != 0;
    else
        val = val1 + val2;
}

因为它是一个模板函数,我希望编译器能够优化分支,实现与真正的模板特化相同的结果。