ranges::to
- это то, что вы хотите.
Легко выполнить собственную замену.
template<class C, class R>
C to_container( R&& r ) {
using std::begin; using std::end;
return C( begin(std::forward<R>(r)), end(std::forward<R>(r)) );
}
Не на уровне библиотеки (отсутствует ранний сбой, так каксамая большая проблема, и не поддерживает |
), но вполне пригодна для использования.
, и тогда мы просто:
std::string r = to_container<std::string>( input | view::remove_if(not_alpha) | view::transform(::tolower) ) | action::sort | action::unique;
Обратите внимание, что взятие адресов функций в std
равно больше не рекомендуется (через @DavisHerring в комментарии выше)
Для обновления до |
:
template<class C>
struct to_container_t {
template<class R>
C operator()( R&& r )const {
using std::begin; using std::end;
return C( begin(std::forward<R>(r)), end(std::forward<R>(r)) );
}
template<class R>
friend C operator|( R&& r, to_container_t self ){
return self( std::forward<R>(r) );
}
};
template<class C>
constexpr to_container_t<C> to_container{};
Что дает нам:
std::string r = input | view::remove_if(not_alpha) | view::transform(::tolower) | to_container<std::string> | action::sort | action::unique;
По мере необходимости.