2017-06-29 4 views
2

Ich habe einige generische Funktion, die eine Variable des Typs <T> zurückgibt. Ich übergebe der Funktion 2 Iteratoren. Dann versuche ich die Größe des Vektors mit der Funktion distance zu berechnen. Innerhalb der Funktion definiere ich eine neue Typdefinition, die v_size heißt, aber der <T> Typ des Vektors ist unbekannt. Wie kann ich die Größe des Vektors berechnen, indem ich nur die Iteratoren überlasse?bestimmen Variablentyp durch Iteratoren C++

template<class In, class T> 
     T my_func(In b, In e) 
{ 

typedef typename vector<T>::size_type v_size; 
v_size size = distance(b, e); 
    ... 
    ... 

} 
+0

'T' wird nicht unbekannt sein, wenn Sie Ihre Funktion instanziieren. Es ist mir nicht klar, auf welches Problem Sie tatsächlich stoßen. Bitte gib ein [MCVE] an. –

+1

Dieser Code ist ziemlich seltsam: Wenn Sie wissen * 'In' ist' std :: Vektor :: Iterator ', warum haben Sie zwei Vorlage Argumente? Wenn nicht, warum verwenden Sie dann 'std :: vector :: size_type'? – MSalters

Antwort

1

Sie können 3 Dinge tun: Abzüglich der Art über die operator*() des Iterators: using v_size = vector<std::remove_reference<decltype(*b)>::type>::size_type;

oder den Typ abziehen mit dem Rückgabetyp der Abstandsfunktion: using v_size = std::decltype(distance(b, e));

oder , noch besser, entfernen Sie die v_size ganz und lassen Sie den Compiler den Typ abziehen: auto size = std::distance(b, e);

+0

Danke, François. Antwort geändert – IlBeldus

+1

Wahrscheinlich sollte 'std :: distance' sein, da Sie sich nicht auf ADL in einer generischen Funktion verlassen können. Zeiger sind Iteratoren ohne zugeordneten Namespace. – MSalters

2

Wenn Sie den Typ erhalten möchten, auf den der Iterator zeigt, können Sie std::iterator_traits verwenden. z.B.

template<class In> 
auto my_func(In b, In e) -> typename std::iterator_traits<In>::value_type 
{ 
    using T = typename std::iterator_traits<In>::value_type; 
    ... 
} 

BTW: Ich beseitigte den zweiten Template-Parameter T, die in der Rücktypdeklaration erscheint nur dann nicht automatisch geschlossen werden kann. Ansonsten müssen Sie beim Aufruf der Funktion explizit angeben.