Создайте диапазоны пользовательских функций просмотра (operator () и operator |) - PullRequest
3 голосов
/ 20 сентября 2019

В настоящее время я пытаюсь обернуться вокруг предстоящих диапазонов std ::.В качестве упражнения я хотел бы реализовать «упрощенное» представление с нуля, которое принимает диапазон / представление для некоторых символов и преобразует их в верхний регистр.

Взломать вместе представление и некоторый итератор было довольно просто,Я не понимаю, как оператор () и |должны быть перегружены для того, чтобы составлять, как остальные диапазоны, хотя.

Вот "toupper_fn" (чтобы следовать соглашению об именовании диапазонов), который я придумал до сих пор.Это в значительной степени копия / вставка некоторой функции представления внутри диапазонов v3:

    struct toupper_fn {
      template <typename Rng>
      auto operator()(Rng&& rng) const {
        return toupper_view{std::forward<Rng>(rng)};
      }

      template <typename Rng>
      friend auto operator|(Rng&& rng, toupper_fn& c)
          -> decltype(c(std::forward<Rng>(rng))) {
        return c(std::forward<Rng>(rng));
      }

      template <typename Rng>
      friend auto operator|(Rng&& rng, toupper_fn const& c)
          -> decltype(c(std::forward<Rng>(rng))) {
        return c(std::forward<Rng>(rng));
      }

      template <typename Rng>
      friend auto operator|(Rng&& rng, toupper_fn&& c)
          -> decltype(std::move(c)(std::forward<Rng>(rng))) {
        return std::move(c)(std::forward<Rng>(rng));
      }
    };

Проблема заключается в том, что с этими определениями и классический синтаксис вызова функции (view (view ...)) исинтаксис канала, работает только в том случае, если мое собственное представление является последним в цепочке.

Вот весь код на Godbolt ->

Либо с диапазонами-v3: https://godbolt.org/z/6RlNVC

Или cmcstl2: https://godbolt.org/z/wba_yW

1 Ответ

0 голосов
/ 27 сентября 2019

Хорошо, я понял это.Проблема с исходным кодом заключалась в том, что мое пользовательское представление не удовлетворяло ни диапазону, ни концепции представления.Это потому, что в моем итераторе отсутствовали некоторые черты ...

Также неплохо было бы обернуть аргумент конструктора внутри range :: view :: all для прямой поддержки контейнеров.Представление «все» создает либо неоперативную, справочную оболочку, либо поддиапазон в зависимости от его типа ввода.

Вот модифицированная рабочая версия: https://godbolt.org/z/5YOGNW

...