我有一个功能:bool inBounds(int value, int low, int high).是否有一个STL等价物可以做有用的事情(特别是采用不同类型的变量)?我找不到使用谷歌的人,我更愿意重复使用而不是重写.
tem*_*def 11
在C++ 14中,没有像这样的函数的直接等价物,但对于具有快速相等比较的较小类型,您可以使用std::clamp:
if (val == std::clamp(val, low, high)) {
...
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以编写自己的函数来测试:
template <typename T>
bool IsInBounds(const T& value, const T& low, const T& high) {
return !(value < low) && (value < high);
}
Run Code Online (Sandbox Code Playgroud)
这将检查是否value在[低,高]范围内.如果你想要范围[低,高],你可以写为
template <typename T>
bool IsInBounds(const T& value, const T& low, const T& high) {
return !(value < low) && !(high < value);
}
Run Code Online (Sandbox Code Playgroud)
注意这是如何纯粹定义的operator <,这意味着任何支持just的类operator <都可以在这里使用.
同样,这里有一个使用自定义比较器:
template <typename T, typename R, typename Comparator>
bool IsInBounds(const T& value, const R& low, const R& high, Comparator comp) {
return !comp(value, low) && comp(value, high);
}
Run Code Online (Sandbox Code Playgroud)
后者具有很好的优点,low并且high不必是相同的类型value,并且只要比较器可以处理它将工作得很好.
希望这可以帮助!
bool inBounds(int value, int low, int high)
Run Code Online (Sandbox Code Playgroud)
缺点是您必须记住哪个参数到达哪里。
在一段时间后返回代码时,我不是唯一一个完全合理的参数顺序令人困惑的人。
您可以加倍努力并定义
template<typename T>
class Interval
{
public:
Interval(T lo, T hi) : low(lo), high(hi) {}
bool contains(T value) const { return low <= value && value < high; }
private:
T low;
T high;
};
template<typename T>
Interval<T> interval(T lo, T hi) { return Interval<T>(lo, hi); }
Run Code Online (Sandbox Code Playgroud)
然后,您可以更清楚地了解您的意思:
if (interval(a, b).contains(value))
// ...
Run Code Online (Sandbox Code Playgroud)
如果处于抽象模式,则可以很容易地概括以适应不同的包含/排斥组合。
当然,这对于您的目的而言可能是过大的。
YMMV,等等。