实施 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.
因为 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.