我有一对迭代器,我想使用ranges::views::filter(some_predicate)它(与管道运算符一起)。AFAIU 我应该首先将我的迭代器对转换为视图。我尝试ranges::subrange(first, last)这样做,但我\xe2\x80\x99m 收到可怕的错误消息。
注1:I\xe2\x80\x99m使用C++14和range-v3版本0.9.1(与gcc-5.5兼容的最后一个版本)。如果使用 C++17/20 和/或使用 C++20 std::ranges 时解决方案不同,I\xe2\x80\x99m 也有兴趣知道发生了什么变化。
\n注2:我发现range-v3 的文档严重缺乏,所以我使用cppreference.com \xe2\x80\x99m 。如果你知道更好的文档,我\xe2\x80\x99m非常感兴趣。
\n编辑:
\n在我的真实代码中, I\xe2\x80\x99m 包装了一个 java 风格的遗留迭代器(它有一个next()方法而不是operator++/ operator*。I\xe2\x80\x99m 将它们包装在 C++ 兼容的包装器中。然后我尝试将其转换为包装到视图中,最后过滤它。我在godbolt上重现了一个最小的示例。iterator_range按照建议使用,但它仍然无法编译\xe2\x80\x99t(请参阅下面的第二次编辑)。
#include "range/v3/all.hpp"\n#include "range/v3/iterator_range.hpp"\n\nclass LegacyIteratorWrapper {\npublic:\n using value_type = int;\n using difference_type = std::ptrdiff_t;\n using pointer = value_type*;\n using reference = value_type&;\n using iterator_category = std::input_iterator_tag;\n\n // The type isn\xe2\x80\x99t default-constructible, the error comes …Run Code Online (Sandbox Code Playgroud)