罗乾林
参考 istream_line_reader 实现的,望老师斧正
template<typename _InIt, typename _Fun>
class filter_view {
public:
class iterator { // 实现 InputIterator
public:
using iterator_category = input_iterator_tag;
using value_type = typename _InIt::value_type;
using difference_type = typename _InIt::difference_type;
using pointer = typename _InIt::pointer;
using reference = value_type&;
iterator(_InIt _First, _InIt _Last, _Fun f)
:_First(_First), _Last(_Last), _fun(f) {
++(*this);
}
reference operator*() const noexcept { return *_Cur; }
pointer operator->() const noexcept { return &(*_Cur); }
iterator& operator++() {
while (_First != _Last && !_fun(*_First)) {
_First++;
}
_Cur = _First;
if (_First != _Last) {
_First++;
}
return *this;
}
iterator operator++(int) {
iterator temp(*this);
++(*this);
return temp;
}
bool operator==(const iterator& rhs)
const noexcept
{
return _Cur == rhs._Cur;
}
bool operator!=(const iterator& rhs)
const noexcept
{
return !operator==(rhs);
}
private:
_InIt _First;
_InIt _Last;
_InIt _Cur;
_Fun _fun;
};
filter_view(_InIt _First, _InIt _Last, _Fun f)
:_First(_First), _Last(_Last), _fun(f) {
}
iterator begin() const noexcept {
return iterator(_First, _Last, _fun);
}
iterator end() const noexcept {
return iterator(_Last, _Last, _fun);
}
private:
_InIt _First;
_InIt _Last;
_Fun _fun;
};
作者回复: OK,没啥大问题。
代码风格要稍微说明一下。你似乎是模拟了库代码的风格,这还是有点风险的。在一般的用户代码里,不应该出现双下划线打头、或者下划线加大写字母打头的标识符——这是给系统保留的。
详见:
https://zh.cppreference.com/w/cpp/language/identifiers