Funktion mit ... im Parameter



  • Hallo, durch das ... kann ich ja beliebige Parameter an meine Funktion übergeben.

    Die Frage ist jetzt wie kann ich hier die Variable str in meiner Funktion func verwenden?

    Oder geht das gar nicht?

    btw. wie nennt man Funktionen wo diese Punkte mit im Parameter sind haben solche Funktionen einen speziellen Namen?

    #include <iostream>
    using namespace std;
    
    void func ( int v, ... );
    
    int main()
    {
    string str = "a";
    var(4, str );
    
    system("PAUSE");
    return 0;
    }
    //---------------------------------------------------------------------------
    
    void func ( int v, ... )
    {
            cout<<v<<"\n";
    }
    

  • Mod

    Das nennt sich ellipsis und sollte in C++ tunlichst vermieden werden. Das ist ein Artefakt aus C, in C++ hast du bessere Sprachmittel zur Verfügung. Was möchtest du erreichen?



  • Such mal nach "ellipsis".



  • SeppJ schrieb:

    Was möchtest du erreichen?

    Verstehen was das ganze auf sich hat und wie es funktioniert.



  • Ah, hab schon was dazu gefunden:

    http://www.cplusplus.com/reference/cstdarg/va_start/

    Wenn das aber aus C Zeiten stammt wie würde man das dann z.b. in C++ umsetzen?



  • Mit variadic templates.



  • Hallo,

    ich kenn das mit ... zwar auch nicht wirklich. Überlege aber auch gerade wie man das mit C++ machen könnte. Ich nehme mal an Templates ala Generic Programming wäre wohl zu aufwendig?!?

    boost::bind macht ja auch sowas ähnliches, wollte dir nachsehen im Quellcode habe aber ehrliches gesagt nicht gecheckt was da abgeht. Vielleicht hilft dir das.

    lg Darian


  • Mod

    Darian schrieb:

    Hallo,

    ich kenn das mit ... zwar auch nicht wirklich. Überlege aber auch gerade wie man das mit C++ machen könnte. Ich nehme mal an Templates ala Generic Programming wäre wohl zu aufwendig?!?

    boost::bind macht ja auch sowas ähnliches, wollte dir nachsehen im Quellcode habe aber ehrliches gesagt nicht gecheckt was da abgeht. Vielleicht hilft dir das.

    lg Darian

    Die Idee ist nicht, 1:1 Funktionen mit beliebig vielen Argumenten in C++ zu machen. Das ist dann nämlich die Ellipse. Oder neuerdings auch variadische Templates. Vielmehr sollte man sich überlegen, was mit der variablen Zahl von Funktionsparametern erreicht werden sollte und ob das überhaupt nötig ist. Ein Beispiel ist printf/ostream. In C wäre es ungeheuer viel Aufwand, für jeden Datentyp eine eigene Funktion zu schreiben und sehr unübersichtlich, diese dann für jede Ausgabe einzeln aufzurufen. Mit der Operatorüberladung ist es jedoch in C++ ganz einfach.



  • func schrieb:

    Hallo, durch das ... kann ich ja beliebige Parameter an meine Funktion übergeben.

    Das stimmt so nicht. Du kannst nur Parameter von POD-Typen hier verwenden. Alles andere ruft dann undefiniertes Verhalten hervor. Beispielsweise hast du std::string verwendet. std::string ist kein POD. Also ruft dein Programm undefiniertes Verhalten hervor. Falls Dich dein Compiler davor nicht gewarnt hat, dann versuch mal die Warnstufe deines Compilers zu erhöhen.

    Davon abgesehen würdest Du zur Compile-Zeit Typinformationen wegschmeißen. Die Funktion kann nicht herausbekommen, wieviele Parameter du angegeben hast und von welchem Typ sie waren. Deswegen muss man ja z.B. beim printf in C auch im Formatstring genau sagen, was man für einen Parameter hat, also %i für Int, %f für double. Was man auch noch wissen sollte ist, dass float dabei automatisch zu double konvertiert wird sowie char/short automatisch zu int (promotion). Deswegen gibt's auch gar keine Format-Kürzel für shorts oder floats. Jedenfalls musst du darauf achten, dass der Formatstring zu den Parametern passt. Für printf haben die meisten Compiler Sonderregeln implementiert, dass sie das überprüfen können. Wenn du eine eigene Funktion baust, die etwas anders arbeitet, kann dir da der Compiler nicht mehr helfen, wenn du das Ding falsch aufrufst.

    Typinformation wegschmeißen ist eher "C-Stil". Sowas will man in C++ nicht machen. Anderes Paradebeispiel in dieser Hinsicht ist C's qsort versus C++'s std::sort. Letzteres ist in jeder Hinsicht besser -- inklusive der Laufzeit-Performance.


Anmelden zum Antworten