dado:especialización de plantilla parcial basada en "firm-ness" de tipo entero?
template<typename T>
inline bool f(T n) {
return n >= 0 && n <= 100;
}
Cuando se utiliza con un tipo de unsigned
genera una advertencia:
unsigned n;
f(n); // warning: comparison n >= 0 is always true
¿Hay alguna manera inteligente para no hacer la comparación n >= 0
cuando T
es un tipo de unsigned
? He intentado añadir una especialización de plantilla parcial:
template<typename T>
inline bool f(unsigned T n) {
return n <= 100;
}
pero gcc 4.2.1 no le gusta eso. (No creo que tipo de especialización de plantilla parcial sería legal de todos modos.)
Tenga en cuenta que no hay una especialización parcial para plantillas de función única, la especialización completa. Dicho esto, la especialización completa suele ser una mala idea para las plantillas de funciones porque las reglas sobre lo que se especializa, lo que se sobrecarga y cómo la resolución de sobrecarga decide qué usar son complicadas y complicadas. Afortunadamente, la sobrecarga y SFINAE (falla de sustitución no es un error) son suficientes aquí. –
No recibo ninguna advertencia de Clang 3.8 (o GCC 8.0) sobre esto. Si elimino la plantilla en 'f', lo entiendo. ¿Hay una versión de '-Wtautological-compare' que considere instancias de plantillas? – user2023370