unbekannte argumente benutzen



  • heiho

    es gibt ja in cpp die moeglichkeit "..." zu benutzen zb

    int ret = sprintf_s(Val, iReserved, rhs.c_str(), ...);
    

    aaaaber
    ich hab hier eine template funktion in welcher ich diese argumente verwenden will

    template<class T>
    void foo<T>::bar(std::string rhs, ...)
    {
        .
        .
        .
        int ret = sprintf_s(Val, iReserved, rhs.c_str(), ...);
        .
        .
        .
    }
    

    compiliert auch problemlos, aber sobald ich es benutzen will:

    dings.bar("abba %d", 15);
    

    kommt der fehler:

    error C2059: syntax error : '...'
    

    bjarne schrieb das die ... einfach eine unbekannte anzahl parameter ist welche keine typpruefung ermoeglichen

    aber wie kann ich diese selber benutzen?



  • Um variable Argumente verarbeiten zu können, gibt es den Typ 'va_list' und die Makros/Funktionen 'va_start()', 'va_arg()' und 'va_end()'. (wieviele und was für Parameter du bekommst, mußt du allerdings selber wissen)

    Für dich hilfreich ist sicher noch vsprintf() - das nimmt anstelle von beliebig vielen Argumenten einen va_list, den du vorbereitet haben mußt.



  • In diesem Fall: garnicht.

    Es gibt aber die Möglichkeit einer Funktion ein Handle (va_list) auf die unbestimmte Argumentliste zu übergeben. Zu Deiner Funktion sprintf_s gibt es dazu das Pendant vsprintf_s, welches statt der unbestimmten Argumentliste eben jenes Handle auf eben jene Liste erwartet. Damit kannst Du Deine Funktion realisieren:

    template<class T>
    void foo<T>::bar(std::string rhs, ...)
    {
        .
        .
        .
        va_list ap;
        va_start(ap, rhs);
        int ret = vsprintf_s(Val, iReserved, rhs.c_str(), ap);
        va_end(ap);
        .
        .
        .
    }
    

    Generell würde ich aber empfehlen, "..." garnicht mehr zu benutzen, da es nicht nur die Typunsicherheit aus C-Zeiten erbt, sondern zusätzlich die Anzahl der Argumente nicht ermittelt werden kann.



  • aaaaaaah - vielen dank dafuer, ich hatte noch sowas im hinterkopf - danke


Anmelden zum Antworten