2016-12-06 4 views
1

begin()とend()の2つのイテレータをとるテンプレート関数を定義したいと思います。どのようにこれはC + +で達成することができますか?C++で2つのイテレータを使用するテンプレート関数を定義する方法は?

これまでのところ、私は、次を考えることができます:

template <class Iterator> 
typename std::iterator_traits<Iterator>::value_type func(Iterator begin, Iterator end) { 

} 

は、この間違いましたか?

答えて

1

標準ライブラリの動作方法(少なくとも<algorithm>を例に取る)は、後に型解決が行われるようにすることです。だからあなたは代わりに:

template <class InputIt, class T> 
T func(InputIt begin, InputIt end) 
{ 
    // ... 
} 
+0

ありがとう。私は 'class InputIt、class T'のこの例とちょっと混乱しています。クラスInputITとクラスTは何ですか?私はどこか他の場所で同じことを読んで、それは私を混乱させた。 – WorldWideBangers

+2

'InputIt'は入力イテレータに使用される型であり、' T'は返される型です。イテレータは実際の 'iterator'クラスである必要はなく、' ++ '、' --'、 '*'の演算子をサポートするだけです。たとえば、生ポインタは有効なイテレータです。したがって、関数を 'iterator'クラスに限定しないでください。検索/修正関数を実装している場合は、 'T'ではなく' InputIt'を返す方が良いでしょう。もし何かがあれば、呼び出し側は返されたイテレータの値をどうするかを決めるでしょう: 'template InputIt func(InputIt begin、InputIt end){...} ' –

+0

ありがとう@RemyLebeau – WorldWideBangers

関連する問題