通常のネストされた typedef ( 、など) を持たずstd::iterator_traits<>、ソースを変更してはならないコンテナー クラス テンプレートの反復子に特化したいと考えています。基本的には、次のようなことをしたいと思います。value_typedifference_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_traitsany のイテレータに特化することで、イテレータ クラスを変更せずにこれを回避できると考えましたContainer<T>。
最後に、できれば既存のコードを変更せずに、count、find、sort などの std アルゴリズムを使用できるようにしたいだけです。iterator_traitsの全体的なポイントはまさにそれだと思いました:組み込みをサポートしていないイテレータ型の型 ( など)value_typeを指定できること。diff_type残念ながら、のすべてのインスタンスに対して traits クラスを特殊化する方法がわかりませんContainer<T>。