【发布时间】:2021-10-10 03:16:54
【问题描述】:
是否有一个具体的模板类(不是概念)来在 std Ranges 中存储一个通用范围(即一对迭代器/哨兵)?
给定一对迭代器,我始终可以将其存储在 std::pair<iterator_type, interator_type> 中,并以 .first 和 .second 的形式访问它们,但实际上它们可以命名为 .begin() 和 .end()。
我发现了这个非常古老的提议,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3350.html#index_1overview
原因是我的函数需要一对迭代器(就像过去一样)并且应该返回它们的 (const) 视图,所以我似乎需要返回一个具体的类型。
template<class It>
a_range<It> my_func(It first, It last){
...
return a_range<It>(first, last);
}
我在 Range 库中没有找到任何内容。 我能找到的最接近的是https://en.cppreference.com/w/cpp/ranges/view_interface。
template<class It>
auto my_func(It first, It last){
...
struct View : public std::ranges::view_interface<View> {
View(It begin, It end) : m_begin(begin), m_end(){}
auto begin() const { return m_begin; }
auto end() const { return m_end; }
private:
It m_begin, m_end;
};
return View{first, last};
}
或者,更重要的是:
...
return std::ranges::transform_view{ View{first, last}, [](auto const& a)->decltype(a){return a;});
}
这是朝着正确的方向发展吗?
首先,我想保留访问类别(例如随机访问等),这似乎没有保留。
还使用transform 来保护(作为 const)元素似乎有点矫枉过正,但这是次要的。
【问题讨论】:
标签: c++ iterator transform std-ranges