Thuật toán chuẩn min
và max
có thể được so sánh với một giá trị duy nhất. Tuy nhiên, giá trị trả về minmax
thuật toán không thể được so sánh với một cặp giá trị:So sánh tiêu chuẩn :: minmax với một cặp
#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
}
Lý do là make_pair(2, 1)
trả về một pair<int, int>
và minmax(1, 2)
lợi nhuận một pair<const int&, const int&>
. Không có sự quá tải trộn operator==
cho pair
.
Sửa chữa sau đó để viết rõ ràng std::pair<const int&, const int&>(int, int)
hoặc để bọc nội dung này trong một chức năng do nhà sản xuất thực hiện make_cref_pair
.
Câu hỏi: có cách nào sạch hơn để so sánh giá trị trả lại minmax
với giá trị pair
không? Và tôi đã xử lý chính xác các tham chiếu trong số make_cref_pair
của tôi?
tôi sợ rằng 'make_cref_pair' có thể không hợp pháp (phần mở rộng thời gian cuộc sống không áp dụng cho các đối tượng con, AFAIK) – sehe
@sehe yikes. Liệu điều tương tự cũng áp dụng cho cặp 'thường' (1,2) '? –
TemplateRex
Nó sẽ giống nhau. Tôi không thực sự chắc chắn về điều này, nhưng nó có vẻ như chơi trên các cạnh có – sehe