C++ Alternative zu va_list



  • Hi
    da mir schon oft aufgefallen ist, dass bei manchen Funktionen als Argument einfach ... angegeben wird, hab ich mich ein bisschen darüber informiert.
    Nun hab ich rausgefunden, dass das ganze eine C Syntax ist, damit man dann in der Funktion beliebig viele Parameter auswerten kann und zwar über den abstrakten Datentyp va_list.
    Mich würde nun interessieren ob man das in C++ genauso macht oder ob es dazu eine Alternative gibt.



  • Hem, also ich habs noch nie gebraucht. Handelt es sich um immer die gleichen Parametertypen? Wenn ja, könnte man ein vector nehmen:

    void foo(std::vector<int> &params)
    {
       ...
    }
    

    Ist ja auch variabel die Anzahl der "Parameter". Wenn es unterschiedliche Parametertypen sind, könnte man sowas wie boost::any nehmen, anstatt vector.



  • Viele (alle?) C-Sprachelemente (unter anderem auch va_list) sind auch unter C++ noch verwendbar - mit den aus C bekannten Problemen.

    Solange du nur POD-Objekte übergibst (und genau weißt, was du da machst), kannst du problemlos mit Ellipsen und va_list arbeiten. Andernfalls bleiben noch Überladungen, Default-Parameter oder solche Ansätze wie Artchi gezeigt hat, um (begrenzt) beliebig viele Parameter übergeben zu können.
    (Aber ein echtes Äquivalent zu den variablen Argumentlisten hat C++ nicht anzubieten)



  • Mhh ok.
    Mir fiele da selbst noch was ein und zwar ein void-Pointer.
    Wenn ich das richtig verstanden habe kann man diesen ja auf alles mögliche zeigen lassen. Und da auch in "Tricks of the Windows Game Programming Gurus" der void-Pointer als Argument angegeben, aber leider bis zu der Stelle an der ich jetzt bin nie verwendet wird, bin ich nicht sicher ob dieser eine ähnliche Funktionalität bietet wie die Ellipse.
    Man müsste wahrscheinlich statt ganz vielen Parametern alle in ein Array oder in eine Klasse/ein struct packen und dieses dann übergeben.
    Was haltet ihr von so einem Konstrukt und ist es "besser oder schlechter" als die Ellipse? (CStoll schrieb von "aus C bekannten Problemen")



  • Sieh dir mal die Implementierung von boost::bind an, da findest du die typsichere Alternative. Ist allerdings nicht sehr "hübsch" und/oder übersichtlich.


Anmelden zum Antworten