一、qBound简介
1. 定义
- 是 Qt 框架中一个非常实用的边界限制函数(也称为 "clamp" 函数),用于将一个值限制在指定的最小值和最大值之间。
- 头文件:#include <QtGlobal>
2. 函数原型
template <typename T>
const T &qBound(const T &min, const T &value, const T &max);
3. 作用
- 确保返回值始终满足:min ≤ result ≤ max
4. 行为准则
- 如果value < min,返回 min;
- 如果value > max,返回 max;
- 如果 min < value < max,返回 value;
5. 等效代码
template <typename T>
const T &qBound(const T &min, const T &val, const T &max) {if (val < min)return min;if (val > max)return max;return val;
}
6. 使用示例
#include <QtGlobal>
#include <QDebug>int main() {// 整数边界限制int val1 = qBound(0, -5, 100); // 返回 0 (小于最小值)int val2 = qBound(0, 50, 100); // 返回 50 (在范围内)int val3 = qBound(0, 150, 100); // 返回 100 (大于最大值)// 浮点数边界限制double dval = qBound(0.0, -1.5, 1.0); // 返回 0.0// 颜色分量限制 (0-255)int red = qBound(0, 300, 255); // 返回 255qDebug() << val1 << val2 << val3; // 输出: 0 50 100qDebug() << dval; // 输出: 0qDebug() << red; // 输出: 255return 0;
}
7. 注意事项
- 参数顺序:
必须确保 min <= max,如果min > max,结果未定义(可能返回错值);
- 安全用法:
qBound(std::min(a,b),value,std::max(a,b));
- 返回值类型:
返回的是 const T& 引用:
避免返回临时对象的引用,当参数是临时对象时可能有问题,如下示例;
int bad = qBound(0, 50, 100) + 10;
二、std::clamp(C++17)
1. 定义
- C++17标准库中引入的函数模板,用于将值限制在指定范围内。
2. 函数原型
template <typename T>
const T& clamp(const T& value, const T& low, const T& high);
3. 用法
#include <algorithm>
int val = std::clamp(rawValue, minValue, maxValue);
4. 行为准则
- 如果 value < low,返回low;
- 如果value > high,返回high;
- 否则返回 value;
5. 前提条件
- 必须满足 low <= high,否则行为未定义;
6. 使用示例
#include <algorithm>
#include <iostream>int main() {int val = 150;// 将值限制在 0-100 范围内int clamped = std::clamp(val, 0, 100);std::cout << "Original: " << val // 输出 150<< "\nClamped: " << clamped // 输出 100<< std::endl;
}
三、区别对比
1. 边界处理
- qBound() :边界可能无效
- std::clamp :已知边界有效
2. 参数顺序
// 助记:std::clamp 是 "值-低-高",qBound 是 "低-值-高"
auto cpp = std::clamp(VALUE, LOW, HIGH);
auto qt = qBound(LOW, VALUE, HIGH);