c++自定义迭代器常量转换完成得很好



我尝试为自定义容器实现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 {
...
}

如果我是对的,我必须为迭代器和const_iterator实现一个复制构造函数,这样迭代器就可以复制到同一类型,普通迭代器也可以复制到const_iteror中
如何做到这一点?

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

您可以为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.

相关内容

最新更新