Vom Typ des Iterators auf den eigentlichen Typ schließen



  • Ist es irgendwie möglich, von einem Iterator auf den Typ zu schließen, für den dieser steht? Beispielsweise kann man mit der Microsoft STL

    std::vector<int>::iterator::value_type Integer;
    

    schreiben.
    In STLport ist iterator aber dummerweise so definiert:

    template <class _Tp, __STL_DEFAULT_ALLOCATOR_SELECT(_Tp) >
    class vector : public _Vector_base<_Tp, _Alloc> 
    {
        ...
        typedef value_type* iterator;
        ...
    }
    

    Überhaupt ist es (soweit ich weiß) nirgendwo definiert, wie ein Iterator auszusehen hat.

    Den Typ, für den der Iterator steht, brauche ich für ein paar Templates:

    template <class InputIterator, class InputSeparatorIterator>
    		containerOutput<InputIterator, typename InputSeparatorIterator::value_type> // <== BÖSE!!!
    									writeContainer (InputIterator begin, InputIterator end, 
    													InputSeparatorIterator separatorBegin,
    													InputSeparatorIterator separatorEnd)
    	{
    		return containerOutput<InputIterator, typename InputSeparatorIterator::value_type> // <== BÖSE!!!
    			(begin, end, separatorBegin, separatorEnd);
    	}
    

    Dazu kommt ja noch das Problem, dass nicht alle Iteratoren vom Standard nicht vorgeschriebene lokale Klassen sind. std::back_insert_iterator ist zum Beispiel sehr wohl vorgeschrieben. Da könnte man zum Beispiel mit

    std::back_insert_iterator<std::vector<int> >::container_type::value_type Integer;
    

    auf den Typ zugreifen. Was mir aber fehlt, ist eine Methode, bei jedem Iterator auf den dazugehörigen Typ zuzugreifen! Ich hoffe, ihr könnt mir helfen...



  • sowas geht leider nicht, da nichtmal vorgeschrieben ist, dass ein iterator eine Klasse sein muss, im falle des vectors zb ist es ein pointer.
    es gibt eine funktion, die vom iterator einen (T*)(0) zurückliefert, diese nennt sich value_type, und kann so verwendet werden:

    template <class ForwardIterator1, class ForwardIterator2, class ValueType>
    inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, ValueType*) {
        ValueType tmp = *a;
        *a = *b;
        *b = tmp;
    }
    
    template <class ForwardIterator1, class ForwardIterator2>
    inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) {
        __iter_swap(a, b, value_type(a));
    }
    


  • Dafür verwendet man die iterator_traits. Die können dir sowas sagen.


Anmelden zum Antworten