我试图从 Rainer Grimm 的书“C++20 Get the details”中弄清楚如何使用 C++20 中的范围。
我想编写自己的过滤器,可以将容器传递给它(让它只是一个向量),并将过滤后的元素输出到其中并传递它。能够写出类似的东西
vect | views::filter(f1) | views::transform(f2) | copy_to(w) | views::filter(f3)
或多或少是这样的。那些。经过过滤和转换后,我们将其放入向量中w
并进一步过滤自己。
只是完全困惑如何做这样的事情。begin()
如果我理解正确,那么应该只有end()
范围。所以?以及如何获取下一个元素并将其写下来?
如果某处有一个关于编写过滤器的简单描述(以及范围本身......我无法以任何方式理解它们,它是如何在里面的) - 我会很高兴听到。
我只是引用我的耻辱,以便由于缺乏我自己的尝试而没有解决这个问题。因为它是“只要它编译”的风格,因为完全误解了它应该如何工作......
using namespace std::ranges;
template<typename Container, std::ranges::input_range Range> requires std::ranges::view<Range>
class copy_to : public std::ranges::view_interface<copy_to<Container,Range>>
{
private:
Container * c = nullptr;
Range range_{};
std::ranges::iterator_t<Range> begin_{ std::begin(range_) };
std::ranges::iterator_t<Range> end_{ std::end(range_) };
public:
//Container() = default;
constexpr copy_to(Container& c, Range r): c(&c), range_(std::move(r)),
begin_(std::begin(r)), end_(std::end(r))
{
for(auto b = begin_; b != end_; ++b) c->push_back(*b);
}
constexpr copy_to(Container& c): c(&c), begin_(std::begin(c)), end_(std::end(c))
{
for(auto b = begin_; b != end_; ++b) c->push_back(*b);
}
constexpr auto begin() const {
return begin_;
}
constexpr auto end() const {
return end_;
}
};
template<typename Container, typename Range>
copy_to(Container&, Range&&) -> copy_to<Container, std::ranges::views::all_t<Range>>;