实施 std::iterator

Implement std::iterator

因为 C++17 弃用 std::iterator,我需要自己实现。原来它只是一个带有一些 typedef 的空结构。

template <class Category, class Type, class Diff = ptrdiff_t,
    class Pointer = Type*, class Reference = Type&>
struct iterator {
  typedef Category iterator_catergory;
  typedef Type value_type;
  typedef Diff difference_type;
  typedef Pointer pointer;
  typedef Reference reference;
};

struct dummy_iter : iterator<std::output_iterator_tag, int> {}

这个有效:

printf("%d\n", std::is_same<typename dummy_iter::pointer, int*>::value);

但是,它不适用于 std::iterator_traits:

printf("%d\n", std::is_same<typename std::iterator_traits<dummy_iter>::pointer, int*>::value);

error: 'pointer' in 'struct std::iterator_traits<dummy_iter>' does not name a type

你打错了。本声明:

typedef Category iterator_catergory;

应该是这样的:

typedef Category iterator_category;

标准规定,除非 iterator_traits 包含所有必需的 typedef,否则它将变为空 class。参见 [iterator.traits]/2:

If Iterator has valid ([temp.deduct]) member types difference_­type, value_­type, pointer, reference, and iterator_­category, iterator_­traits shall have the following as publicly accessible members:

  using difference_type   = typename Iterator::difference_type;
  using value_type        = typename Iterator::value_type;
  using pointer           = typename Iterator::pointer;
  using reference         = typename Iterator::reference;
  using iterator_category = typename Iterator::iterator_category;

Otherwise, iterator_­traits shall have no members by any of the above names.