Удалить предупреждение о производительности в шаблонном классе C ++ - PullRequest
0 голосов
/ 20 февраля 2012


Я хочу удалить предупреждение о производительности преобразования с плавающей точкой в ​​функцию шаблонного класса, и в этом случае 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


Я бы предпочел не просто отключить предупреждение.

Редактировать: добавлен визуальный тег студии

Ответы [ 2 ]

6 голосов
/ 20 февраля 2012

Вы можете извлечь операцию в отдельный шаблон и перегрузить для 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.
2 голосов
/ 20 февраля 2012

Просто используйте is_same с блоком if, чтобы «специализироваться» на bool.Это часть стандартной библиотеки, на случай, если вы не хотите использовать 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;
}

Поскольку это шаблонная функция, я ожидаю, что компилятор оптимизирует ветку, достигая того же результата, как если быэто была настоящая шаблонная специализация.

...