вопрос про operator<() для std::tuple
От: niXman Ниоткуда https://github.com/niXman
Дата: 29.04.15 20:53
Оценка:
в 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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.