2017-06-15 6 views
0

C++ 17はstd::iteratorを非難するので、私は自分自身を実装する必要があります。それは、いくつかのtypedefを持つ空のstructであることが分かります。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'はまだ標準であり、それを提供するためにはすべての標準ライブラリ実装が必要です。非推奨とは、今後**何かが削除される可能性があるという警告です。それはそれを削除しません、そして、それが削除されることを意味しません。 Cのヘッダーは1998年以後非難されており、まだ生きていて、蹴って広く使われています。 –

答えて

3

。この文:

typedef Category iterator_catergory; 

ではなく、このことが必要です。

typedef Category iterator_category; 

標準はiterator_traitsは、必要なすべてのtypedefが含まれていない限り、それは空のクラスになることを指定します。 【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

いい仕事です。あなたは1分以内に私を倒す。 :-) –

関連する問題