11

通常のネストされた 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_typeiterator_traitsany のイテレータに特化することで、イテレータ クラスを変更せずにこれを回避できると考えましたContainer<T>

最後に、できれば既存のコードを変更せずに、count、find、sort などの std アルゴリズムを使用できるようにしたいだけです。iterator_traitsの全体的なポイントはまさにそれだと思いました:組み込みをサポートしていないイテレータ型の型 ( など)value_typeを指定できること。diff_type残念ながら、のすべてのインスタンスに対して traits クラスを特殊化する方法がわかりませんContainer<T>

4

4 に答える 4

12

はい。T推論できないコンテキストであるため、コンパイラは推論できません。Container<T>::iteratorつまり、与えられContainer<T>::iteratorた の値をT一意かつ確実に推論できないことを意味します (詳細な説明については、 this を参照してください)。

この問題の唯一の解決策は、プログラムで使用する予定の可能な値ごとに完全に特化することです。クラス テンプレートを編集することは許可されていないため、一般的な解決策はありません。iterator_traitsiteratorContainer<T>

于 2011-10-28T10:21:44.357 に答える
0

Containeras template パラメータをに非常によく使用できますiterator_traits。STL の残りの部分にとって重要なのは、traits クラス内の typedef などvalue_typeです。それらは正しく設定する必要があります:

template <class Container> struct iterator_traits
{
    public:
        typedef typename Container::value_type value_type;
    // etc.
};

次に、value_type以前に使用していた場所を使用しますT

traits クラスの使用に関しては、もちろん、外部コンテナーのタイプでパラメーター化します。

iterator_traits<TheContainer> traits;

TheContainer当然、これは一般的な STL コンテナーの規約に準拠し、value_type正しく定義されていることを前提としています。

于 2011-10-28T10:07:07.420 に答える