2012-04-10 6 views
0

Ich habe die folgende Funktion, die ein std::vector von Iteratoren in einer anderen Behälter erzeugt:Was würde die Syntax in decltype (x) zu setzen, um den Rückgabetyp in dieser Situation zu spezifizieren

template <typename T, 
      template <typename, typename = std::allocator<T>> class Con> 
std::vector<typename Con<T>::iterator> make_itervec(Con<T>& v) 
{ 
    std::vector<typename Con<T>::iterator> itervec; 
    for (auto i = v.begin(); i != v.end(); ++i) 
    { 
     itervec.push_back(i); 
    } 
    return itervec; 
} 

Was ich tun mag, das ist:

template <typename T, 
      template <typename, typename = std::allocator<T>> class Con> 
auto make_itervec(Con<T>& v) -> decltype(x) // This line 
{ 
    std::vector<typename Con<T>::iterator> itervec; 
    for (auto i = v.begin(); i != v.end(); ++i) 
    { 
     itervec.push_back(i); 
    } 
    return itervec; 
} 

Was kann ich für x gestellt dies funktioniert?

versucht, aber gescheiterte Versuche:

decltype(std::vector<typename Con<T>::iterator>) 
decltype(std::vector<decltype(v)::iterator>) 

(Auch ich bin kein Experte auf diesem, so dass alle anderen Vorschläge, Kommentare sind willkommen Dank!).

Antwort

3

Sie std::vector<decltype(v)::iterator> oder std::vector<decltype(v.begin())> nutzen könnten. Beachten Sie, dass es keinedecltype um die std::vector gibt, denn das ist bereits ein Typ, keine Variable oder Ausdruck. decltype wird nur verwendet, um den Typ eines Ausdrucks zu erhalten.

+0

Danke, du hast mich in die richtige Richtung gezeigt. Die Verwendung von 'std :: vector ' funktionierte jedoch nicht (Kompilierfehler), aber 'std :: vector :: iterator>' tat (mit gcc 4.7.0) . –

+0

@ildjarn: Nein, der gleiche Fehler: 'erwartete einen Typ, bekam declltype (v) :: iterator'. –

+0

@ildjarn: Ich habe 'std :: vector itervec = make_itervec (v);' auch in meinem Code verwendet, was gut funktioniert, verstehe also definitiv nicht, warum es nicht funktioniert. –

3

Ich glaube, Sie tun auch viel Arbeit hier. Alles, was Sie tun müssen, ist dies:

template <typename T> 
std::vector<typename T::iterator> make_itervec(T& v) 
{ 
    std::vector<typename T::iterator> itervec; 

    for (auto i = v.begin(); i != v.end(); ++i) 
    { 
     itervec.push_back(i); 
    } 

    return itervec; 
} 
+0

Sie haben definitiv Recht. Vielen Dank. –