我有一个模板化函数,它对模板类型变量进行操作,如果该值小于0,则将其设置为0.这样可以正常工作,但是当我的模板化类型未签名时,我会收到有关如何比较总是的警告假.这显然是有道理的,但由于它是模板化的,我希望它对所有数据类型(有符号和无符号)都是通用的,而不是发出警告.
我在Linux上使用g,我猜测有一种方法可以通过命令行选项来抑制该特定警告,但是我还是希望在其他非模板化的情况下得到警告.我想知道在代码中是否有某种方法可以防止这种情况,而无需编写多个版本的函数?
template < class T > T trim(T &val) { if (val < 0) { val = 0; } return (val); } int main() { char cval = 5; unsigned char ucval = 5; cout << "Untrimmed: " << (int)cval; cval = trim(cval); cout << " Trimmed: " << (int)cval << endl; cout << "Untrimmed: " << (int)ucval; cval = trim(ucval); cout << " Trimmed: " << (int)ucval << endl; return (0); }
解决方法
#include <algorithm> template<class T> T& trim(T& val) { val = std::max(T(0),val); return val; }
通过非const引用传递的问题并不明显.您可以更改上面的返回值(void),按值传递并按值返回,或者通过const&并按值返回:
template<class T> T trim(T const& val); // example use: value = trim(value); // likely the most clear solution
Generalize多一点,即使超出了你的问题范围:
template<class T> T constrain(T const& value,T const& lower,T const& upper) { // returns value if value within [lower,upper] (inclusive end points) // returns lower if value < lower // otherwise returns upper assert(lower <= upper); // precondition return std::min(std::max(value,lower),upper); } template<class T> T constrain_range(T const& value,upper) (exclusive upper) // returns lower if value < lower // otherwise returns upper - 1 assert(lower < upper); // precondition if (value < lower) return lower; else if (value >= upper) return upper - 1; else return value; }