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).


Anmelden zum Antworten