标准算法min
,max
可以与单个值进行比较。但是,minmax
算法返回值不能与一对值进行比较:
#include <algorithm>
#include <utility>
template<class T1, class T2>
constexpr auto make_cref_pair(T1&& t1, T2&& t2)
{
return std::pair<T1 const&, T2 const&>(std::forward<T1>(t1), std::forward<T2>(t2));
}
int main()
{
static_assert(std::min(2, 1) == 1); // OK
static_assert(std::max(2, 1) == 2); // OK
//static_assert(std::minmax(2, 1) == std::make_pair(1, 2)); // ERROR, const int& vs int pair comparison
static_assert(std::minmax(2, 1) == std::pair<const int&, const int&>(1, 2)); // OK
static_assert(std::minmax(2, 1) == make_cref_pair(1, 2)); // OK
}
原因是make_pair(2, 1)
返回 apair<int, int>
并minmax(1, 2)
返回 a pair<const int&, const int&>
。没有参考混合operator==
重载pair
。
然后解决方法是显式编写std::pair<const int&, const int&>(int, int)
或将其包装在自制make_cref_pair
函数中。
问题:有没有更简洁的方法来比较minmax
返回值和一个pair
值?我是否正确处理了我的引用make_cref_pair
?