gpt4 book ai didi

c++ - 由于范围有限,比较总是错误的...使用模板

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:32 24 4
gpt4 key购买 nike

我有一个对模板类型变量进行操作的模板化函数,如果该值小于 0,则将其设置为 0。这工作正常,但是当我的模板化类型是无符号时,我会收到一条警告,说明比较总是错误的。这显然是有道理的,但由于它是模板化的,我希望它对所有数据类型(有符号和无符号)都是通用的,而不是发出警告。

我在 Linux 上使用 g++,我猜测有一种方法可以通过 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;
}

从这个问题来看,通过非常量引用传递是否合适并不明显。可以把上面的return nothing(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, T const& lower, T const& upper) {
// returns value if value within [lower, 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;
}

关于c++ - 由于范围有限,比较总是错误的...使用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2056996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com