Определенный пользователем адаптер конвейерного представления завершается с ошибкой, если лямбда-захват не пуст ⇐ C++
-
Гость
Определенный пользователем адаптер конвейерного представления завершается с ошибкой, если лямбда-захват не пуст
Я хотел создать свой собственный, передаваемый по конвейеру split_when, и исправив некоторые первоначальные проблемы, мне удалось заставить этот пример работать:
auto main() -> int { auto v = std::vector{1, 2, 3, 4, 5}; автоматическое разделение = v | so::views::splitWhen([](int n) { return n % 2 == 0; }); for (автоматический диапазон: разделение) { for (авто e: диапазон) { std::cout SplitWhenIterator& { current_ = std::ranges::find_if(current_, end_, predicate_); если (текущий_ != конец_) ++текущий_; вернуть *это; } автооператор++(int) -> авто { if constexpr (std::forward_iterator) { авто tmp = * это; +*** это; вернуть ТМП; } еще +*** это; } autooperator*() const -> std::ranges::subrange { auto next = std::ranges::find_if(current_, end_, predicate_); if (next != end_) return {current_, std::next(next)}; вернуть {текущий_, следующий}; } autooperator(const SplitWhenIterator& rhs) const -> auto { return std::tie(current_, end_) std::tie(rhs.current_, rhs.end_); } autooperator==(const SplitWhenIterator& rhs) const -> bool { return std::tie(current_, end_) == std::tie(rhs.current_, rhs.end_); } }; шаблон SplitWhenView(R&&, F) -> SplitWhenView; } и, наконец, мой адаптер:
пространство имен so::views { встроенный адаптер constexpr SplitWhen = []( Диапазон&& диапазон, Предикат&& предикат ) { return SplitWhenView(std::forward(range), std::forward(predicate)); }; }
Я хотел создать свой собственный, передаваемый по конвейеру split_when, и исправив некоторые первоначальные проблемы, мне удалось заставить этот пример работать:
auto main() -> int { auto v = std::vector{1, 2, 3, 4, 5}; автоматическое разделение = v | so::views::splitWhen([](int n) { return n % 2 == 0; }); for (автоматический диапазон: разделение) { for (авто e: диапазон) { std::cout SplitWhenIterator& { current_ = std::ranges::find_if(current_, end_, predicate_); если (текущий_ != конец_) ++текущий_; вернуть *это; } автооператор++(int) -> авто { if constexpr (std::forward_iterator) { авто tmp = * это; +*** это; вернуть ТМП; } еще +*** это; } autooperator*() const -> std::ranges::subrange { auto next = std::ranges::find_if(current_, end_, predicate_); if (next != end_) return {current_, std::next(next)}; вернуть {текущий_, следующий}; } autooperator(const SplitWhenIterator& rhs) const -> auto { return std::tie(current_, end_) std::tie(rhs.current_, rhs.end_); } autooperator==(const SplitWhenIterator& rhs) const -> bool { return std::tie(current_, end_) == std::tie(rhs.current_, rhs.end_); } }; шаблон SplitWhenView(R&&, F) -> SplitWhenView; } и, наконец, мой адаптер:
пространство имен so::views { встроенный адаптер constexpr SplitWhen = []( Диапазон&& диапазон, Предикат&& предикат ) { return SplitWhenView(std::forward(range), std::forward(predicate)); }; }
Мобильная версия