一、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);