range-v3 / сортировка путаницы - PullRequest
0 голосов
/ 24 июня 2018

Я немного прост, мне кажется, что я не совсем вижу причину этой ошибки в строке, отмеченной ошибкой ниже.

std :: sort и boost :: sort поднимаетпредикат по умолчанию, но range-v3 по какой-то причине этого не делает.Это диапазоны-v3 0,36.Аналогичная ошибка в Clang 6/7 и GCC 7/8.

#include <range/v3/all.hpp>

#include <algorithm>
#include <boost/hana.hpp>
#include <utility>
#include <vector>
#include <boost/range/algorithm.hpp>


namespace hana = boost::hana;

template< typename T = int>
struct point_t {
  BOOST_HANA_DEFINE_STRUCT(point_t<T>, (T, x), (T, y));

  constexpr bool operator<(const point_t<T> &b) const noexcept {
    return hana::less(hana::to_tuple(*this), hana::to_tuple(b));
  };
};

int main() {

  std::vector<point_t<point_t<>>> all;

  boost::sort(all); // OK
  std::sort(std::begin(all), std::end(all)); //OK

  ranges::sort(all, std::less<point_t<point_t<>>>()); // OK
  ranges::sort(all, hana::less); // OK

  ranges::sort(all); // error no matching function for call to object of type 'const with_braced_init_args<ranges::v3::sort_fn>'

  return 0;
}

1 Ответ

0 голосов
/ 24 июня 2018

Кейси быстро ответил через список проблем range-v3 .

Вот его комментарий в виде текста по запросу вместо исходного изображения, которое я разместил здесь:

ranges::sort без аргумента компаратора требует, чтобы тип был отсортировано по модели концепции StrictTotallyOrdered. Это означает тип должен определять все ==, !=, <, >, <= и >= с последовательные семанты.

На что я ответил там:

Спасибо, что так быстро вернулись. Теперь я понимаю. я должен сказать это немного разочаровывает, это несовместимо с std::sort и boost::sort требования. Вот цена, которую мы платим за range-v3 прелесть, я думаю.

Еще раз спасибо, --Matt.

К сожалению, требования выше, чем std::sort и boost::sort, поэтому код не будет просто работать. Я понимаю мотивацию.

Для любопытных std::rel_ops и boost/operators, казалось, мешали моей цели поддержки совокупной инициализации для интроспективных структур, поэтому я, к сожалению, прибегнул к макросам (аналогично приведенным ниже).

Я поиграю еще немного и поищу лучшее статичное полиморфное решение.

С уважением,

-. Matt

#define JEST_STRUCT(T)                                                         \
  constexpr bool operator==(const T &b) const noexcept {                       \
    return hana::equal(hana::to_tuple(*this), hana::to_tuple(b));              \
  };                                                                           \
                                                                               \
  constexpr bool operator!=(const T &b) const noexcept {                       \
    return hana::not_equal(hana::to_tuple(*this), hana::to_tuple(b));          \
  };                                                                           \
                                                                               \
  constexpr bool operator<(const T &b) const noexcept {                        \
    return hana::less(hana::to_tuple(*this), hana::to_tuple(b));               \
  };                                                                           \
                                                                               \
  constexpr bool operator<=(const T &b) const noexcept {                       \
    return hana::less_equal(hana::to_tuple(*this), hana::to_tuple(b));         \
  };                                                                           \
                                                                               \
  constexpr bool operator>(const T &b) const noexcept {                        \
    return hana::greater(hana::to_tuple(*this), hana::to_tuple(b));            \
  };                                                                           \
                                                                               \
  constexpr bool operator>=(const T &b) const noexcept {                       \
    return hana::greater_equal(hana::to_tuple(*this), hana::to_tuple(b));      \
  } 
...