template <bool flag, class IsTrue, class IsFalse>
struct choose;
template <class IsTrue, class IsFalse>
struct choose<true, IsTrue, IsFalse> {
typedef IsTrue type;
};
template <class IsTrue, class IsFalse>
struct choose<false, IsTrue, IsFalse> {
typedef IsFalse type;
};
template <class T, bool isconst = false>
struct slist_iterator {
typedef std::forward_iterator_tag iterator_category;
typedef T value_type;
typedef std::ptrdiff_t difference_type;
typedef typename choose<isconst, const T&, T&>::type
reference;
typedef typename choose<isconst, const T*, T*>::type
pointer;
typedef typename choose<isconst, const slist_node<T>*,
slist_node<T>*>::type
nodeptr;
slist_iterator(nodeptr x = 0) : p(x) { }
slist_iterator(const slist_iterator<T, false>& i)
: p(i.p) { }
reference operator*() const { return p->val; }
pointer operator->() const { return &(p->val); }
slist_iterator& operator++() {
p = p->next;
return *this;
}
slist_iterator operator++(int) {
slist_iterator tmp(*this);
++*this;
return tmp;
}
nodeptr p;
};
End of Listing