http://en.cppreference.com/w/cpp/algorithm/clamp дает это как возможную реализацию для std::clamp
:
template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp )
{
return assert( !comp(hi, lo) ),
comp(v, lo) ? lo : comp(hi, v) ? hi : v;
}
В то время как я действительно понимаю, как это работает, размещение утверждения assert в возвращении кажется мне довольно странным; Я бы написал это как:
template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp )
{
assert( !comp(hi, lo) );
return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
}
Тем не менее, я предполагаю, что они выбрали их реализацию по какой-то причине; есть ли преимущество их версии над "моей"?