в libstdc++
оно реализовано так:
// This class performs the comparison operations on tuples
template<typename _Tp, typename _Up, size_t __i, size_t __size>
struct __tuple_compare {
static constexpr bool __eq(const _Tp& __t, const _Up& __u) {
return bool(std::get<__i>(__t) == std::get<__i>(__u))
&& __tuple_compare<_Tp, _Up, __i + 1, __size>::__eq(__t, __u);
}
static constexpr bool __less(const _Tp& __t, const _Up& __u) {
return bool(std::get<__i>(__t) < std::get<__i>(__u))
|| (!bool(std::get<__i>(__u) < std::get<__i>(__t)) // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< вопрос в этой строке
&& __tuple_compare<_Tp, _Up, __i + 1, __size>::__less(__t, __u));
}
};
template<typename _Tp, typename _Up, size_t __size>
struct __tuple_compare<_Tp, _Up, __size, __size> {
static constexpr bool __eq(const _Tp&, const _Up&) { return true; }
static constexpr bool __less(const _Tp&, const _Up&) { return false; }
};
template<typename... _TElements, typename... _UElements>
constexpr bool
operator<(const tuple<_TElements...>& __t, const tuple<_UElements...>& __u) {
static_assert(sizeof...(_TElements) == sizeof...(_UElements), "tuple objects can only be compared if they have equal sizes.");
using __compare = __tuple_compare<tuple<_TElements...>, tuple<_UElements...>, 0, sizeof...(_TElements)>;
return __compare::__less(__t, __u);
}
интересующая строка отмечена.
вопрос в том, зачем менять аргументы местами и проверять что они не меньше?
т.е. тут мы берем по одному элементу из обеих тьюплов по индексу '__i', проверяем на меньше, а потом меняем тьюплы местами, берем те же самые элементы, и проверяем на НЕ меньше.
в чем смысл?
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)