Дано:Специализация частичного шаблона на основе «подписанности» целочисленного типа?
template<typename T>
inline bool f(T n) {
return n >= 0 && n <= 100;
}
При использовании с unsigned
типа генерирует предупреждение:
unsigned n;
f(n); // warning: comparison n >= 0 is always true
Есть ли умный способ не делать сравнение n >= 0
когда T
является unsigned
типа? Я попытался добавить частичную специализацию шаблона:
template<typename T>
inline bool f(unsigned T n) {
return n <= 100;
}
но gcc 4.2.1 не нравится. (Я не думал, что , что вид частичной специализации шаблона будет законным в любом случае.)
Обратите внимание, что не существует частичная специализация шаблонов функций, только полной специализации. Тем не менее, полная специализация, как правило, представляет собой плохую идею для шаблонов функций, поскольку правила, касающиеся того, что получает специализированное, что перегружено, и то, как разрешение перегрузки решает, что использовать, сложны и запутаны. К счастью, перегрузки и SFINAE (сбой замены не является ошибкой) достаточно. –
Я не получаю предупреждения от Clang 3.8 (или GCC 8.0). Если я удалю шаблон на 'f', я получу его. Есть ли версия '-Wtautological-compare', которая рассматривает шаблонные экземпляры? – user2023370