通常のネストされた typedef ( 、など) を持たずstd::iterator_traits<>
、ソースを変更してはならないコンテナー クラス テンプレートの反復子に特化したいと考えています。基本的には、次のようなことをしたいと思います。value_type
difference_type
template <typename T> struct iterator_traits<typename Container<T>::iterator>
{
typedef T value_type;
// etc.
};
T
ただし、コンパイラはから推測できないため、これは機能しませんContainer<T>::iterator
。
同じことを達成するための有効な方法はありますか?
例えば:
template <typename T>
class SomeContainerFromAThirdPartyLib
{
typedef T ValueType; // not value_type!
// no difference_type
class iterator
{
typedef T ValueType; // not value_type!
// no difference_type
...
};
iterator begin() { ... }
iterator end() { ... }
...
};
std::count()
ここで、このクラスのインスタンスを使用して呼び出すとします。私の知る限り、ほとんどの STL 実装では、 をcount()
返しますiterator_traits<Iterator>::difference_type
。の主要なテンプレートはiterator_traits<I>
単に dotypedef typename I::difference_type difference_type
です。他のネストされた型と同じです。
この例では、 がないため、これは明らかに機能しませんContainer::iterator::difference_type
。iterator_traits
any のイテレータに特化することで、イテレータ クラスを変更せずにこれを回避できると考えましたContainer<T>
。
最後に、できれば既存のコードを変更せずに、count、find、sort などの std アルゴリズムを使用できるようにしたいだけです。iterator_traits
の全体的なポイントはまさにそれだと思いました:組み込みをサポートしていないイテレータ型の型 ( など)value_type
を指定できること。diff_type
残念ながら、のすべてのインスタンスに対して traits クラスを特殊化する方法がわかりませんContainer<T>
。