Создание std :: range on std :: cin и view compositionC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Создание std :: range on std :: cin и view composition

Сообщение Anonymous »

Я переживаю «функциональное программирование в C ++» (да, он становится немного длинным в зубе, но это то, что у меня сейчас есть), и я пытаюсь преобразовать некоторые примеры в нем в C ++ 20 (G ++ 13.3.0), и я столкнулся с контрольно -пропускным пунктом с рецензией на диапазонах. и преобразование этого в отдельные слова, понижая буквы, удаляя любую неаллекнумерику из этого набора, затем сортируя его. В исходной записи использовалась библиотека диапазонов/V3, и у меня возникают проблемы с конвертацией этого в C ++ 20. В частности, начальная часть, посвященная созданию диапазона (или представления) на stdin, а затем передает это следующему преобразованию. Я пытаюсь использовать что-то вроде следующего: < /p>

Код: Выделить всё

    const std::vector words =
// Getting a range of words (tokens) from cin
std::views::istream(std::cin)
| views::transform(tolower)  // Converting all words to lower-case
| views::transform(isalnum)  // Removing non alphanumeric characters from the words
| views::filter([] (const std::string &s) {
return !s.empty();
})
| std::ranges::sort;
Это сбои на первом преобразовании с ошибкой:

Код: Выделить всё

main.cpp: In function ‘int main(int, char**)’:
main.cpp:38:9: error: no match for ‘operator|’ (operand types are ‘std::ranges::basic_istream_view’ and ‘std::ranges::views::__adaptor::_Partial’)
37 |         std::views::istream(std::cin)
|         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|                                         |
|                                         std::ranges::basic_istream_view
38 |         | views::transform(tolower)  // Converting all words to lower-case
|         ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
|                           |
|                           std::ranges::views::__adaptor::_Partial
In file included from main.cpp:7:
/usr/include/c++/13/ranges:896:7: note: candidate: ‘template  requires (derived_from) && (derived_from) constexpr auto std::ranges::views::__adaptor::operator|(_Lhs, _Rhs)’
896 |       operator|(_Lhs __lhs, _Rhs __rhs)
|       ^~~~~~~~
/usr/include/c++/13/ranges:896:7: note:   template argument deduction/substitution failed:
/usr/include/c++/13/ranges:896:7: note: constraints not satisfied
In file included from /usr/include/c++/13/compare:37,
from /usr/include/c++/13/bits/char_traits.h:56,
from /usr/include/c++/13/ios:42,
from /usr/include/c++/13/ostream:40,
from /usr/include/c++/13/iostream:41,
from main.cpp:1:
/usr/include/c++/13/concepts: In substitution of ‘template  requires (derived_from) && (derived_from) constexpr auto std::ranges::views::__adaptor::operator|(_Lhs, _Rhs) [with _Lhs = std::ranges::basic_istream_view; _Rhs = std::ranges::views::__adaptor::_Partial]’:
main.cpp:38:35:   required from here
/usr/include/c++/13/concepts:67:13:   required for the satisfaction of ‘derived_from’ [with _Lhs = std::ranges::basic_istream_view]
/usr/include/c++/13/concepts:67:28: note:   ‘std::ranges::views::__adaptor::_RangeAdaptorClosure’ is not a base of ‘std::ranges::basic_istream_view’
67 |     concept derived_from = __is_base_of(_Base, _Derived)
|                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/13/ranges:887:7: note: candidate: ‘template  requires (derived_from) && (__adaptor_invocable) constexpr auto std::ranges::views::__adaptor::operator|(_Range&&, _Self&&)’
887 |       operator|(_Range&& __r, _Self&& __self)
|       ^~~~~~~~
/usr/include/c++/13/ranges:887:7: note:   template argument deduction/substitution failed:
/usr/include/c++/13/ranges:887:7: note: constraints not satisfied
/usr/include/c++/13/ranges: In substitution of ‘template  requires (derived_from) &&  (__adaptor_invocable) constexpr auto std::ranges::views::__adaptor::operator|(_Range&&, _Self&&) [with _Self = std::ranges::views::__adaptor::_Partial; _Range = std::ranges::basic_istream_view]’:
main.cpp:38:35:   required from here
/usr/include/c++/13/ranges:859:13:   required for the satisfaction of ‘__adaptor_invocable’ [with _Self = std::ranges::views::__adaptor::_Partial; _Range = std::ranges::basic_istream_view]
/usr/include/c++/13/ranges:860:9:   in requirements  [with _Adaptor = std::ranges::views::__adaptor::_Partial; _Args = {std::ranges::basic_istream_view}]
/usr/include/c++/13/ranges:860:44: note: the required expression ‘declval()((declval)()...)’ is invalid
860 |       = requires { std::declval()(declval()...); };
|                    ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail
In file included from /usr/include/c++/13/bits/memory_resource.h:38,
from /usr/include/c++/13/string:58,
from /usr/include/c++/13/bits/locale_classes.h:40,
from /usr/include/c++/13/bits/ios_base.h:41,
from /usr/include/c++/13/ios:44:
/usr/include/c++/13/cstddef:135:3: note: candidate: ‘constexpr std::byte std::operator|(byte, byte)’
135 |   operator|(byte __l, byte __r) noexcept
|   ^~~~~~~~
/usr/include/c++/13/cstddef:135:18: note:   no known conversion for argument 1 from ‘std::ranges::basic_istream_view’ to ‘std::byte’
135 |   operator|(byte __l, byte __r) noexcept
|             ~~~~~^~~
/usr/include/c++/13/bits/ios_base.h:87:3: note: candidate: ‘constexpr std::_Ios_Fmtflags std::operator|(_Ios_Fmtflags, _Ios_Fmtflags)’
87 |   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
|   ^~~~~~~~
/usr/include/c++/13/bits/ios_base.h:87:27: note:   no known conversion for argument 1 from ‘std::ranges::basic_istream_view’ to ‘std::_Ios_Fmtflags’
87 |   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
|             ~~~~~~~~~~~~~~^~~
/usr/include/c++/13/bits/ios_base.h:130:3: note: candidate: ‘constexpr std::_Ios_Openmode std::operator|(_Ios_Openmode, _Ios_Openmode)’
130 |   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
|   ^~~~~~~~
/usr/include/c++/13/bits/ios_base.h:130:27: note:   no known conversion for argument 1 from ‘std::ranges::basic_istream_view’ to ‘std::_Ios_Openmode’
130 |   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
|             ~~~~~~~~~~~~~~^~~
/usr/include/c++/13/bits/ios_base.h:170:3: note: candidate: ‘constexpr std::_Ios_Iostate std::operator|(_Ios_Iostate, _Ios_Iostate)’
170 |   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
|   ^~~~~~~~
/usr/include/c++/13/bits/ios_base.h:170:26: note:   no known conversion for argument 1 from ‘std::ranges::basic_istream_view’ to ‘std::_Ios_Iostate’
170 |   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
|             ~~~~~~~~~~~~~^~~

< /code>
В типичной моде C ++ это очень точное и совершенно неразборчивое (для меня).  Я попытался создать начальный диапазон различных способов, но, по -видимому, все они решаются до одного и того же базового std :: ranges :: basic_istream_view 
, поэтому результат одинаково.
Очевидно, этот подход работал в исходной библиотеке диапазонов/V3 (с iStream_range (std :: cin) ), но не работает в текущей библиотеке STD.
Есть ли способ заставить это работать?

Подробнее здесь: https://stackoverflow.com/questions/794 ... omposition
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»