В настоящее время я пытаюсь обернуться вокруг предстоящих диапазонов 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