完美的转发迭代器:太多了吗?

时间:2018-11-07 11:17:02

标签: c++ iterator c++17 perfect-forwarding

在C ++中,对象的常量是通过迭代器转发的。如果std::begin(a)不是const,A::iterator通常会返回a,如果A::const_iterator是const,则a会返回。

我试图将此概念扩展到移动行为,以便获得更好的通用代码。基本思想是这样的:

struct A {
  using value_type = std::string;
  using iterator = AIter<A>;
  using const_iterator = AIter<A const>;
  using move_iterator = AIter<A &&>;

  iterator begin() &;
  iterator end() &;
  const_iterator begin() const &;
  const_iterator end() const &;
  move_iterator begin() &&;
  move_iterator end() &&;
};

template <typename A> struct AIter {
  using a_type = A;
  using value_type = typename std::decay_t<A>::value_type;
  using reference = std::conditional_t<
      std::is_rvalue_reference_v<A>, value_type &&,
      std::conditional_t<std::is_const_v<std::remove_reference_t<A>>,
                         value_type const &, value_type &>>;
};

这有点令人费解,尤其是迭代器中的条件类型。概念仅仅是,迭代器的类型完全取决于A引用类型

不幸的是,当我尝试使用std::beginstd::end(以及所有类似的函数)而不是直接使用成员函数时,会出现问题,因为它们并非旨在在< em>完美转发的方式。 Here如果要进行测试,可以在编译器资源管理器上找到一个小型演示。

鉴于目前的情况,我的意思是:

  • 我是否对标准迭代器要求太多?这种方法有什么意外行为吗?我从没见过像std::begin(std::move(a))这样的东西(您通常使用std::make_move_iterator来做到这一点),但是在通用代码中,我认为使用std::begin(std::forward<A>(a))可能有用……或者没有?
  • 对于这种方法如何与C ++ 20范围配合使用,我不清楚。你觉得呢?
  • 如果您认为这种方法可能有价值,那么您认为使用.begin()方法或执行完美转发的自定义免费功能会更好吗?到编译器资源管理器的链接中类似的内容。

编辑:Nelfeal发现this other question与我的关系密切。

0 个答案:

没有答案