如何解决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>
的朋友,但并非相反。因此,您可以在条件构造函数中复制所需的任何成员。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。