variable Argumentenliste



  • Ich möchte in einer Funktion eine unbestimmte Anzahl von Argumenten verarbeiten.

    Dazu habe ich folgendes gefunden

    int foo(int Anzahl, ...){/**/}
    
    void main(void)
    {
        foo(3, 0,1,2);
    }
    

    Das geht alles sehr schön. Nur möchte ich noch zusätzliche (vector) Parameter übergeben.
    Also

    template<typename T>
    int TForm1::foo(vector<vector<T> > *vec, int Anzahl, ...){/**/}
    

    Das alleine kann auch so dastehen. Aber wenn ich die Funktion aufrufe

    foo(&vec, 3, 0, 1, 2);
    

    gibts ne Fehlermeldung

    [C++ Fehler] Unit1.cpp(43): E2285 Keine Übereinstimmung für 'TForm1::foo<T>(vector<vector<AnsiString,allocator<AnsiString> >,allocator<vector<AnsiString,allocator<AnsiString> > > > *,int,int,int,int)' gefunden

    Plötzlich stört wohl der vector in der Argumentenliste. Warum.
    Was kann ich da machen?



  • Hab jetzt gemerkt, das es ohne

    template<typename T>
    int TForm1::foo(vector<vector<T> > *vec, int Anzahl, ...){/**/}
    

    geht
    Der vector im Funtionsrumpf muss dann explizit als vector<vector<AnsiString> > *vec deklariert werden.

    Ich hätte trotzdem noch ne Frage, gibt es eine Möglichkeit
    bei foo(int Anzahl, ...) die int Anzahl wegzulassen, also die Argumentenliste völlig dynamisch offen zu lassen?



  • Nein



  • Du könntest vereinbaren als letzten Parameter immer 0 zu übergeben.

    Greetz, Swordfish



  • Swordfish schrieb:

    Du könntest vereinbaren als letzten Parameter immer 0 zu übergeben.

    Greetz, Swordfish

    Und dann?



  • Naja, dann kanste alle Parameter abarbeiten, bis du irgendwann beim wert 0 ankommst und weißt das Schluss ist!?

    Greetz, Swordfish



  • @Trulli
    Warum nimmst du statt der variablen Argumentliste nicht einen vector<int>. Dann kannst du beliebige Größen verwenden.



  • Weil ich nicht so machen will..

    vector<int> inti;
    inti blablabla...
    foo(Arg, inti)
    

    sondern

    foo(Arg, bla, bla 2,4);
    


  • 1. in C/C++ gibt es keine variablen Argumentlisten (höchstens Vorbelegungen)

    2. Wenn du keinen Zeiger oder vec oder stuct oder anderen "Container" nutzen willst / kannst, muss es dabei bleiben



  • Christian211 schrieb:

    1. in C/C++ gibt es keine variablen Argumentlisten (höchstens Vorbelegungen)

    Das ist falsch. Sieh mal in den Standard 8.3.5 und dort besonders Abschnitt 2.
    Ausschnitt daraus

    If the parameter declaration clause terminates with an ellipsis, the number of arguments shall be equal to or greater than the number of parameters specified. Where syntactically correct, “, ...” is synonymous with “...”. [Example: the declaration
    int printf(const char*, ...);
    declares a function that can be called with varying numbers and types of arguments.
    printf("hello world");
    printf("a=%d b=%d", a, b);
    However, the first argument must be of a type that can be converted to a const char*. ] [Note: the standard header <cstdarg> contains a mechanism for accessing arguments passed using the ellipsis (see 5.2.2 and 18.7). ]



  • Das muss ich heute abend mal ausprobieren. War mir neu. Habe ich auch noch in keiner Doku gesehen


Anmelden zum Antworten