我想实现我的扩展的通用减少操作C ++ 20的ranges,将收集的任何元素range到一个给定的容器。为了实现这一点,我首先创建了一个用于提取template template参数的虚拟类型,并提供operator|了将 arange与其组合:
template <template <typename> typename T>
struct to_fn { };
template <template <typename> typename T>
inline constexpr detail::functors::to_fn<T> to;
template <template <typename> typename T>
auto operator|(std::ranges::range auto&& rng, detail::functors::to_fn<T>) {
return T(std::ranges::begin(rng), std::ranges::end(rng));
}
Run Code Online (Sandbox Code Playgroud)
测试如下:
int main() {
using namespace std::ranges;
std::vector<int> vec = {1, 2, 3, 4, 5};
auto set = vec | to<std::set>;
static_assert(std::same_as<decltype(set), std::set<int>>);
assert(equal(vec, set));
}
Run Code Online (Sandbox Code Playgroud)
代码完成执行没有问题。
但是,代码在与 一起使用时无法编译std::ranges::istream_view …
显然,C++20 有一个新的std::istream相关构造:std::istream_view。其上的 cppreference 页面现在是一个存根\xe2\x80\xa0。那么,什么是“视图istream”以及我可以用它做什么?
\xe2\x80\xa0 - 好吧,从技术上讲,它重定向到一个关于该std::basic_istream_view存根的页面。