2017-06-15 78 views
0

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

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 
+2

您不必实现自己的。 'std :: iterator'仍然在标准中,并且每个标准库实现都需要提供它。弃用是一种警告,表示将来可能会删除**。这并不会将其删除,但这并不意味着它会被删除。自1998年以来,C头文件已被弃用,并且它们仍然活着,踢腿并被广泛使用。 –

回答

3

你有一个错字。本声明:

typedef Category iterator_catergory; 

应该是这个:

typedef Category iterator_category; 

该标准规定,除非iterator_traits包含所有需要的类型定义,它成为一个空类。参见[iterator.traits]/2:

如果迭代器具有有效的([temp.deduct])成员类型difference_type, VALUE_TYPE,指针,参考,和的iterator_category, iterator_traits应具有如下面的公开 访问成员:

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; 

否则iterator_traits应通过任何 上述名称没有成员。

+0

干得不错。你在一分钟之内击败了我。 :-) –

相关问题