2017-05-25 5 views
4

Angenommen, ich habe eine Template-Funktion, die verschiedene Arten von Vektoren verwendet (aber aus verschiedenen Gründen kann ich das im Template-Parameter nicht erwähnen). Hier ist, was ich versuche zu tun: ein neues, standardmäßig konstruierte Element an einer bestimmten Stelle einzufügen, ohne seinen Typen zu wissen:std :: vector einfügen, ohne den Typ der Elemente zu kennen

template <typename T> 
void foo(T* v) { 
    v->insert(v->begin() + 5, decltype(v->at(0))()); 
} 

Das funktioniert nicht, sondern gibt Ihnen eine Vorstellung davon, was ich versuche, machen. Ich habe auch versucht, value_type von std::vector zu verwenden, aber ich lief dort auch Probleme. Irgendwelche Ideen, wie man dieses Problem löst?

+1

Sie sollten einen Fehler erhalten, der das Problem hoffentlich beschreibt. Zum Beispiel sagt GCC, "Fehler: Wert-Initialisierung des Referenztyps" – Justin

+0

'v.insert (v.begin() + 5, decltype (v) :: value_type());' –

+0

@RichardCritten Das wird nicht funktionieren und es ist zu viel Arbeit; wir können bereits 'T' verwenden – Justin

Antwort

9

Seitschritt die ganze "der Typenbezeichnung" business:

v->emplace(v->begin() + 5); 

oder

v->insert(v->begin() + 5, {}); 

Ihre aktuelle Version funktioniert nicht, weil decltype(v->at(0)) eine Art Referenz. value_type sollte funktionieren, wenn Sie es richtig verwenden, aber ohne zu sehen, was Sie tun, kann ich nicht sagen, was falsch daran ist.

+0

Wahrscheinlich wird 'value_type' wie folgt verwendet:' v-> insert (v-> begin() + 5, T :: value_type {}) 'wenn es wie folgt verwendet werden müsste: v-> insert (v-> begin() + 5, typename T :: value_type {}) ' – Justin

+0

Folgefrage: Was, wenn ich * eine * statische Funktion auf den Werttyp des Vektors aufrufen muss? Dann brauche ich den Typ, richtig? Sagen wir:' declltype (v-> at (0)) :: Bar() ', aber das funktioniert auch nicht. –

+1

' std :: remove_reference bei (0))> :: type :: Bar() '. Wenn es Ihnen nicht wichtig ist, die Static-Ness zu erzwingen, kann auch die übliche '.'-Syntax verwendet werden. –

1

Wenn Sie wissen, v ist immer ein std::vector von einem Element-Typ, dann geben Sie es einfach so beginnen, so T ist der Elementtyp, nicht der Vektortyp:

template <typename T> 
void foo(std::vector<T>* v) { 
    v->insert(v->begin() + 5, T()); 
} 

, die auch sicherstellt, dass v->insert() und v->begin() + 5 sind gültige Anweisungen. Sie Original-Code erlaubt etwas für v weitergegeben werden, so dass es keine Garantie dafür, dass v->insert() und v->begin() existieren, oder dass begin() kehrt ein Random-Access-Iterator, + 5 akzeptiert.

Verwandte Themen