微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++自定义迭代器const转换正确完成

如何解决C ++自定义迭代器const转换正确完成

我尝试为自定义容器实现与std兼容的自定义迭代器的副本构造函数。 容器看起来像这样:

template <typename T,Alloc>
class container {
    template <typename ValueType>
    class raw_iterator;
    
    ...
    using value_type = T;
    ...

    using iterator = raw_iterator<value_type>
    using const_iterator = raw_iterator<const value_type>
    ...
}

raw_iterator看起来像这样:

template <typename T,Alloc>
template <typename ValueType>
class container<T,Alloc>::raw_iterator {
    ...
}

如果我是对的,我必须为iterator和const_iterator都实现一个复制构造函数,以便可以将迭代器复制到相同的类型,并且可以将普通的迭代器复制到const_iterator。
如何实现?

PS:我必须在复制构造函数中提供一些功能,所以我不能使用隐式生成的构造函数

解决方法

您可以为const_iterator创建一个隐式构造函数,该构造函数将迭代器作为参数。然后一切都会“正常”。

以下是我认为您想要的示例:

#include <type_traits>

template <typename ValueType>
class raw_iterator {
  public:
    // Typedefs
    using non_const_value_type = std::remove_const_t<ValueType>;
    using const_value_type = std::add_const_t<non_const_value_type>;

    // Constructor - Need extra template argument here to allow SFINAE to work.
    template <class U = ValueType,std::enable_if_t<std::is_same<U,const_value_type>::value,int> = 0>
    raw_iterator (raw_iterator<non_const_value_type> const & other) {
      // Do stuff.
    }

  private:
    // Friends - Make raw_iterator<X> friend of raw_iterator<X const>
    friend std::conditional_t<
        std::is_same<ValueType,non_const_value_type>::value,raw_iterator<const_value_type>,void
      >;
};

有一个条件构造函数带有一个raw_iterator<AnythingNonConst>,只有当raw_iterator自己的寺庙类型为AnythingConst时才存在。

此外,raw_iterator<AnythingNonConst>raw_iterator<AnythingConst>的朋友,但并非相反。因此,您可以在条件构造函数中复制所需的任何成员。

这是一个在线示例:https://wandbox.org/permlink/8gDzHyheIrpsTL5y

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。