小编Rob*_*bin的帖子

如何将一对迭代器转换为视图?

我有一对迭代器,我想使用ranges::views::filter(some_predicate)它(与管道运算符一起)。AFAIU 我应该首先将我的迭代器对转换为视图。我尝试ranges::subrange(first, last)这样做,但我\xe2\x80\x99m 收到可怕的错误消息。

\n

注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

编辑:

\n

在我的真实代码中, I\xe2\x80\x99m 包装了一个 java 风格的遗留迭代器(它有一个next()方法而不是operator++/ operator*。I\xe2\x80\x99m 将它们包装在 C++ 兼容的包装器中。然后我尝试将其转换为包装到视图中,最后过滤它。我在godbolt上重现了一个最小的示例。iterator_range按照建议使用,但它仍然无法编译\xe2\x80\x99t(请参阅下面的第二次编辑)。

\n
#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)

c++ range-v3

5
推荐指数
1
解决办法
1685
查看次数

当这些对象具有相同的二进制表示时,“reinterpret_cast”两个不相关的对象向量是否安全?

我有围绕 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)

鉴于此AB共享完全相同的二进制布局,以下代码是否包含未定义的行为还是安全?

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只包含一个组合IndexAstd::optional<IndexA>std::variant<IndexA, other types like IndexA>,或std::vector<IndexA or std::optional<IndexA>, …> …

c++ casting

3
推荐指数
1
解决办法
105
查看次数

标签 统计

c++ ×2

casting ×1

range-v3 ×1