例子摘自:
《mastering-the-c17-stl-make-full-use-of-the-standard-library-components-in-c17.pdf》
struct list_node {
int data;
list_node *next;
};
template<bool Const>
struct list_of_ints_iterator {
friend class list_of_ints;
friend class list_of_ints_iterator<!Const>;
//Const为true的时候,编译成const list_node*,为false的时候,为list_node*
using node_pointer = std::conditional_t<Const, const list_node*,
list_node*>;
using reference = std::conditional_t<Const, const int&, int&>;
node_pointer ptr_;
explicit list_of_ints_iterator(node_pointer p) : ptr_(p) {}
public:
reference operator*() const { return ptr_->data; }
auto& operator++() { ptr_ = ptr_->next; return *this; }
auto operator++(int) { auto result = *this; ++*this; return result; }
// Support comparison between iterator and const_iterator types
template<bool R>
bool operator==(const list_of_ints_iterator<R>& rhs) const
{
return ptr_ == rhs.ptr_;
}
template<bool R>
bool operator!=(const list_of_ints_iterator<R>& rhs) const
{
return ptr_ != rhs.ptr_;
}
// Support implicit conversion of iterator to const_iterator
// (but not vice versa)
operator list_of_ints_iterator<true>() const
{
return list_of_ints_iterator<true>{ptr_};
}
};
struct list_of_ints {
list_of_ints(list_node* phead, list_node* ptail)
{
head_ = phead;
tail_ = ptail;
}
list_node *head_ = nullptr;
list_node *tail_ = nullptr;
// ...
public:
//Iterators and Ranges
using const_iterator = list_of_ints_iterator<true>;
using iterator = list_of_ints_iterator<false>;
iterator begin() { return iterator{ head_ }; }
iterator end() { return iterator{ nullptr }; }
const_iterator begin() const { return const_iterator{ head_ }; }
const_iterator end() const { return const_iterator{ nullptr }; }
};
template<typename type>
struct TypePrint;
int main(int, char**)
{
list_node node5{ 5, NULL };
list_node node4{ 4, &node5 };
list_node node3{ 3, &node4 };
list_node node2{ 2, &node3 };
list_node node1{ 1, &node2 };
list_of_ints list{ &node1, &node5 };
for (list_of_ints_iterator<false> it=list.begin(); it!=list.end();++it)
{
//编译时会给出提示信息,打印it的类型。是list_of_ints_iterator<false>
//TypePrint<decltype(it)> x;
std::cout << *it << std::endl;
}
for (auto it : list)
{
//编译时会给出提示信息,打印it的类型。是int
//TypePrint<decltype(it)> x;
std::cout << it << std::endl;
}
return 0;
}