Я хочу написать повышающий адаптер, чтобы поместить его в конец цепочки адаптеров для создания коллекции, например:
set<string> s = input | filtered(...) | transformed(...) | to_set;
Использование метода 3.1 Я написал приведенный ниже код, который работает так, как ожидалось:
namespace detail
{
struct to_set_forwarder
{
};
};
template <class R> inline auto operator|(R& r, detail::to_set_forwarder)
{
return set<R::value_type>(r.begin(), r.end());
}
template <class R> inline auto operator|(const R& r, detail::to_set_forwarder)
{
return set<const R::value_type>(r.begin(), r.end());
}
namespace
{
const auto to_set = detail::to_set_forwarder();
}
void F()
{
vector<string> input{ "1", "2", "3" };
auto result = input
//| boost::adaptors::filtered([](const auto& _) { return true; })
| to_set;
}
Но если я раскомментирую эту строку, я получу:
ошибка C2338: стандарт C++ запрещает контейнеры с элементами const, поскольку распределитель неправильно сформирован.
Если я сделаю первый параметр operator|
равным &&
, тогда это будет работать, пока я не раскомментирую строку filtered()
, и тогда я получу:
ошибка C2825: «R»: должен быть классом или пространством имен, если за ним следует «::»
Как правильно это сделать?