Return 带有断言和逗号运算符
Return with assert and comma operator
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 语句放在 return 中对我来说似乎很奇怪;我会把它写成:
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;
}
不过,我猜他们选择实施是有原因的;他们的版本比 "mine" 有优势吗?
在 C++11 中,constexpr
函数只能有一个 return 语句(参见 here)。建议的实现允许函数在 C++11 兼容编译器中使用。
C++14 删除了此限制,因此您的实现在 C++14 或更高版本中也有效。
不管这个,功能完全等同,你的可读性肯定更好。
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 语句放在 return 中对我来说似乎很奇怪;我会把它写成:
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;
}
不过,我猜他们选择实施是有原因的;他们的版本比 "mine" 有优势吗?
在 C++11 中,constexpr
函数只能有一个 return 语句(参见 here)。建议的实现允许函数在 C++11 兼容编译器中使用。
C++14 删除了此限制,因此您的实现在 C++14 或更高版本中也有效。
不管这个,功能完全等同,你的可读性肯定更好。