VALUE_TYPEイテレータは、例えばタイプ、対応する:ベクター<整数>を::それをイテレータ、それは実際* intで、対応するイテレータ型は、本明細書反復イテレータを指し、すなわち、本明細書,,対応型intを指す型イテレータオブジェクトのタイプ。
イテレータを使用する場合は、時々、この時間は、イテレータを取得する方法を、我々は唯一のイテレータの種類を知っている機能の使用のイテレータ型VALUE_TYPEの戻り値が必要な場合、例えば、対応するタイプのVALUE_TYPEイテレータを使用する必要があってもよいが、 VALUE_TYPE?
この問題を解決するためのSTLの方法:
STLのイテレータが定義されている場合は、ステートメントが埋め込まれている間型VALUE_TYPE、すなわち:
1つのテンプレート< クラス T>
2 構造体イテレータ{
3。 VALUE_TYPE Tのtypedef; // インラインVALUE_TYPEを入力宣言する
。4 T * PTR;
5 }。
したがって、上述した要求を使用する場合は次のようであってもよいです。
1つのテンプレート< クラス I>
2型名:: VALUE_TYPE I // 戻り型
3。 func_exp(I ITER){
4。 復帰 * ITER;
5 }
テンプレートがインスタンス化される前に、私は、テンプレートのタイプだったので、コンパイラは、私が何であるかを知らないコンパイラに私を伝えること:: VALUE_TYPEを型として責任型名、、、私は私を知らない:: VALUE_TYPEはタイプを示します。
我々はイテレータを定義しないので、しかし、ネイティブポインタはイテレータとして、我々は、その埋め込み型のVALUE_TYPEを宣言することはできません。
それはVALUE_TYPE場合、一次ポインタとカスタムイテレータイテレータクラス型、それを得る方法を得ることができないように、すなわち、2つのケースが存在します。
スキルをプログラミング特性を使用し、それは上記の2つの異なる状況を解決するためのテンプレートの部分特殊化を使用して、VALUE_TYPE独立して入手することができます。
1つのテンプレート< クラスは I>
2 構造体にiterator_traits {
3 のtypedefはVALUE_TYPE I VALUE_TYPEをtypenameです::;
4 };
5
6。テンプレート< クラス T>
7。 構造体にiterator_traits <T *> { // イテレータとして特殊ネイティブポインタ
8 T VALUE_TYPEのtypedefは、
9 }。
この時間VALUE_TYPEの再利用では、次のように、ネイティブポインタは、問題のVALUE_TYPEを解決するために取得しました:
1つのテンプレート< クラス T>
2にiterator_traits <T> :: VALUE_TYPE // 戻り値の型、にiterator_traits VALUE_TYPE型を用いて推定
3。 FUNC(T ITER){
4。 復帰 * ITER;
5 }
形質「の特徴抽出機」: