Größe eines C-Arrays
-
Hallo,
ich stell mich nun seit einiger Zeit die Frage, was volkard hier gemacht:
template<typename T,size_t size> T* begin(T (&arr)[size]) { return &arr[0]; } template<typename T,size_t size> T* end(T (&arr)[size]) { return &arr[size]; }(hieraus: klick )
Das mit dem zweiten Parameter, size, versteh ich nicht. Das wird doch nirgens angegeben, wie funktioniert das hier dann?
for ( int* it(begin(geldEinheiten)); it != end(geldEinheiten); ++it )Wie funktioniert das, ich dachte immer man müsste die Größe des Arrays als Parameter angeben? Was genau passiert da? Kann das bitte jemand der Reihe nach erklären?
-
T wird auch nirgens wo angegeben. Zumindest muss man die Template-Parameter bei der Verwendung in diesem Fall nicht mit angeben. Dazu haben wir ja "Template Argument Deduction". Der Compiler findet die Template-Parameter anhand des Funktionsarguments selbst raus.
template<class T, int N> void foo(T (&ref)[N]); int main() { int arr[33]; foo(arr); }ref ist eine Referenz auf ein N-elementiges Array mit Element-Typ T. Passenderweise ist arr ein int[33]. Daraus leitet der Compiler T=int und N=33 ab.
-
Der Trick dabei liegt in der Template-Instanzierung und der Tatsache, daß bei der Übergabe per Referenz auch die Array-Größe unterschieden wird. Das heißt, bei der Anwendung auf
int geldeinheiten[]={...};kann der Compiler sowohl den Typ T=int als auch die Größe size des Arrays feststellen (und erzeugt für jede Array-Größe eine eigene Funktions-Spezialisierung).