2016-12-19 5 views
1

SGI STLのイテレータの特性について学ぶときに問題が発生しました。なぜvalue_type関数はSGI STLのポインタを返します

これは、イテレータのタイプを取得する関数です。

template <class Iterator> 
inline typename iterator_traits<Iterator>::value_type* value_type(const Iterator&){ 
    return static_cast<typename iterator_traits<Iterator>::value_type*>(0); 
} 

そして、これは私がvalue_type機能がvalue_type*代わりのvalue_typeを返すために持っている理由だろvalue_type

template <class ForwardIterator, class T> 
inline void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x){ 
     __uninitialized_fill(first,last,x,value_type(first)); 
} 

template <class ForwardIterator, class T, class T1> 
inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x, T1*){ 
     typedef typename __type_traits<T1>::is_POD_type is_POD; 
     __uninitialized_fill_aux(first, last, x, is_POD()); 
} 

を呼び出す関数ですが、私は理由を理解することはできません。私の意見では、どちらの解決策もOKと思われます。

誰かが私を助けることを願っています、ありがとう!

答えて

2

私はvalue_type機能がvalue_type*代わりのvalue_typeを返すために持っている理由は、私は理由を理解することはできませんだろうか。私の意見では、どちらの解決策もOKと思われます。

uninitialized_fillは、このパラメータには名前が付けられません。私たちはそのタイプが必要なだけで、ここでオーバーヘッドが発生したくないのです。

任意のタイプのTについては、どのように構築するか、またはコピー可能か移動可能かはわかりません。従ってvalue_typeを直接渡すことは不可能であり、副作用が完全に望ましくないコピーを被って被せない可能性があります。しかし、0からT*を構築できることは確かです。したがって、value_typeへのゼロで初期化されたポインタを使用することは、この状況で便利なハックです。 SGIの実装は本当に古く、でもC++ 98に先行するので、私は標準ライブラリのより現代的な実装を見てみ推薦すること


注意。

+0

+1テンプレートパラメータを並べ替えるだけで、それを '__uninitialized_fill :: value_type>(first、last、x);という名前で呼び出すことができたときに、 –

+0

私はどの実装を見るべきか分かりませんが、実装のバージョンをお勧めしますか? – Jiahao

+0

@Pyjamasは 'libC++'または 'libstdC++'プロジェクトを検索します –

関連する問題