Hi. Auf der Suche nach einer Möglickkeit ein Array in einen Vektor zu konvertieren bin ich auf folgendes Template gestoßen: template< typename T, size_t N > std::vector<T> makeVector( const T (&data)[N] ) { return std::vector<T>(data, data+N); } const int values[] = { 1,2,3,7 }; std::vector<double> array = makeVector(values); Auch weil man hier nichts hardkodieren muß(Array-Größe) finde ich das Template passend für meine Zwecke. Nur ist mir nicht genau klar wie im Template die Größe N vom Compiler bestimmt wird. Bitte um Aufklärung ;-). Gruß Benny
Benny schrieb: > Template die Größe N vom Compiler bestimmt wird. Die wird nicht "bestimmt", der Compiler merkt sich einfach, was du beim Array-Anlegen angegeben hast. Mit dynamisch allozierten Arrays klappt das mit dem Template natürlich nicht mehr.
Die Maschinerie dazu nennt sich Template Argument Deduction. Deine Funktion hat 2 template Parameter und erwartet eine Referenz auf ein Array von Ts mit N Elementen. Wenn du diese Funktion mit einem Array aufrufst versucht der Compiler den Typ T und den Wert N vom übergebenen Typ abzuleiten. Wie der Compiler das genau tut ist durch zahlreiche Regeln festgelegt, die nicht gerade einfach sind, aber oft das tun was man intuitiv erwartet. Wenn du die Funktion mit etwas anderem als einem Array aufrufst, einem Pointer z.B. dann wird Template Argument Deduction fehlschlagen und es gibt einen Fehler vom Compiler. Falls du mehr über diese Thema wissen möchtest kann ich dir dieses Video (und auch alle anderen Videos von STL) empfehlen: http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-2-of-n Edit: Ich weiß nicht was du genau mit der Funktion erreichen willst aber wenn du nur einfach einem std::vector Werte zuweisen willst dann gibt es seit C++11 praktische initializer lists mit denen folgender Code möglich ist: std::vector<double> array = { 1,2,3,7 };
:
Bearbeitet durch User
im Übrigen gibt es für diesen Fall (ein vector fester größe) ein standard container, der ein C-Array wrappt, ohne weiteren Overhead: std::arrray
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.