Template-Funktion zum löschen von Array



  • Wie kann ich folgendes Makro:

    #define CLEARARRAY(arr) { memset(arr, 0, sizeof(arr)); }
    

    Als Template-Funktion schreiben? Ich hab schon alles probiert, bekomme es aber nicht gebacken...

    mfg.



  • Grundsätzlich so:

    template <typename T>
    void cleararray (T* arr)
    {
        memset(arr,0,sizeof(arr));
    }
    

    aber! sizeof(arr) wird dir in diesem Fall mit ziemlicher Sicherheit nicht das gewünschte Ergebnis liefern. Das was du wahrscheinlich suchst ist ohne zweiten Parameter bei cleararray imho nicht möglich.

    MfG SideWinder



  • SideWinder schrieb:

    Grundsätzlich so:

    template <typename T>
    void cleararray (T* arr)
    {
        memset(arr,0,sizeof(arr));
    }
    

    aber! sizeof(arr) wird dir in diesem Fall mit ziemlicher Sicherheit nicht das gewünschte Ergebnis liefern. Das was du wahrscheinlich suchst ist ohne zweiten Parameter bei cleararray imho nicht möglich.

    MfG SideWinder

    Jo, genau das suche ich 😃
    Und ich dachte halt, dass das mit Templates geht, da dort ja alles beim compilieren erstellt wird und sizeof() dann funktionieren könnte. Auch habe ich gelesen, dass man theoretisch jedes makro durch ein funktionstemplate ersetzten kann. Stimmt das überhaupt?

    mfg.


  • Mod

    template <typename T, size_t N>
    void cleararray (T(&arr)[N])
    {
        std::fill_n( &arr[0], N, T() );
    }
    

    joomoo schrieb:

    Auch habe ich gelesen, dass man theoretisch jedes makro durch ein funktionstemplate ersetzten kann. Stimmt das überhaupt?

    nein. macros haben durchaus ihre berechtigung - allerdings lassen sich die meisten einfachen macro-funktionnen durch templates ersetzen, und dabei kann man eben problemen, die durch den einsatz von macros entstehen, aus dem weg gehen.



  • camper schrieb:

    template <typename T, size_t N>
    void cleararray (T(&arr)[N])
    {
        std::fill_n( &arr[0], N, T() );
    }
    

    Das versteh ich irgentwie nicht. Besonders der Pramater:

    T(&arr)[N]
    

    Was macht hier der & Operator?

    mfg.



  • joomoo schrieb:

    Das versteh ich irgentwie nicht. Besonders der Pramater:

    T(&arr)[N]
    

    Was macht hier der & Operator?

    Das selbe wie bei int& x. Er leitet die Deklaration einer Referenz ein. In diesem Fall eine Referenz namens arr auf ein Array der Größe N mit Elementtyp T.
    Die Klammern sind nötig, da T& arr[N] ein Array von Referenzen auf T wäre. Das ist zum einen nicht gewollt und zum anderen auch gar nicht möglich, da Arrays von Referenzen in C++ nicht legal sind.


Anmelden zum Antworten