我有一对迭代器,我想使用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) 我有围绕 int 的新类型,以及包含这些新类型的类。
class IndexA {
int i;
};
class A {
IndexA index;
};
// this mimic exactly the hierarchy of `A`
struct IndexB {
int i;
};
struct B {
IndexB index;
};
Run Code Online (Sandbox Code Playgroud)
鉴于此A并B共享完全相同的二进制布局,以下代码是否包含未定义的行为还是安全?
std::vector<A> vfoo {...};
std::vector<B> vbar {
std::move(
reinterpret_cast<std::vector<B>&>(vfoo)
)
};
Run Code Online (Sandbox Code Playgroud)
我本来希望能够从做一个零拷贝的举动转变std::vector<A>到std::vector<B>。是否可以?
在我的代码中:
A并且B实际上只是围绕 的包装器int,因此它们具有完全相同的二进制表示形式。A只包含一个组合IndexA,std::optional<IndexA>,std::variant<IndexA, other types like IndexA>,或std::vector<IndexA or std::optional<IndexA>, …> …