Mehrere Parameterargumente



  • void foo(int flags)
    {
        if(flags & 0x1) //0001b
            bar();
        if(flags & 0x2) //0010b
            foobar();
    
        if(flags & 0x4) //0100b
        {
            barfoo();
            baz();
        }
    
        if(flags & 0x8) //1000b
            foobaz();
    }
    




  • Alles klar, dankeschön



  • Nagut, mit der binären Zusammenstellung der Flags habe ich das nun hinbekommen, nun würde ich mich einen Schritt weiter wagen wollen und das derzeitige Problem angreifen, ich müsste nämlich mehrere String-Parameter und mehrere konstante Optionen übergeben, am besten erklärt es die Funktion "auswahl" welche angegebene Elemente auswählt:

    auswahl(zahlen);
    auswahl("text");
    auswahl("text" && zahlen);
    auswahl("text" && zahlen && "anderer text" && zeichen)
    

    zahlen , zeichen usw. repräsentieren konstante Optionen, wobei zahlen z.b. für alle Zahlen stehen können.

    Wie wäre dies realisierbar?



  • Eine variable Anzahl an Parametern ist zwar möglich per Ellipsis (http://en.cppreference.com/w/cpp/utility/variadic), aber die Frage ist hier, ob das wirklich nötig ist. Erkläre doch mal, was genau deine Funktion machen soll. Eventuell gibt es da alternative Möglichkeiten.



  • _matze schrieb:

    Eine variable Anzahl an Parametern ist zwar möglich per Ellipsis (http://en.cppreference.com/w/cpp/utility/variadic), aber die Frage ist hier, ob das wirklich nötig ist. Erkläre doch mal, was genau deine Funktion machen soll. Eventuell gibt es da alternative Möglichkeiten.

    Es ist im Grunde nichts lebenswichtiges, aber ein Schritt zur Erleichterung der Schreibarbeit und Lesbarkeit des Codes.

    Nehmen wir zum beispiel eine Text-Filter-Methode, diese Filtert bestimmte Zeichen bzw. Zeichenketten aus einer bestehenden Zeichenkette, um nun alle numerischen Zeichen, bestimmte Buchstaben oder Wörter herauszufiltern müsste man 100500 mal die selbe Filter-Methode ansprechen wie im folgenden Beispiel:

    string str = "Hier ist meine Zeichenkette aus [45] Zeichen!";
    str.filter("4");
    str.filter("5");
    str.filter("!");
    str.filter("[");
    str.filter("]");
    str.filter("Zeichen");
    str.filter("aus");
    

    Mal angenommen, ich möchte alle Ziffern ('4', '5'), alle Sonderzeichen ('!', '[', ']') und die Wörter "Zeichen" und "aus" aus dieser Zeichenkette herausfiltern, problematisch wäre, wenn der String alle Zahlen von 0-9 enthalten würde, und für jede Zahl die Methode aufgerufen werden müsste, eine konstante Option, die sofort alle Zahlen deklarieren würde, wäre eine viel bequemere Variante, das selbe würde dann auch für die Sonderzeichen gelten:

    string str = "Hier ist meine Zeichenkette aus [45] Zeichen!";
    str.filter(zahlen);
    str.filter(sonderzeichen);
    str.filter("Zeichen");
    str.filter("aus");
    

    Der Code sieht nun schon deutlich besser aus als zuvor, manche würden es dabei belassen, aber ich persönlich würde gerne wissen, wie ich diese 4 Zielen in eine einzige bekomme und später von der folgenden Syntax profitieren:

    string str = "Hier ist meine Zeichenkette aus [45] Zeichen!";
    str.filter(zahlen + sonderzeichen + "Zeichen" + "aus");
    

    Hiermit bringe ich also alle 4 Elemente, die ich herausfiltern möchte, "unter 1 Dach" und kann so viele Elemente gleichzeitig angeben wie ich nur möchte.

    Der Additionsoperator und die Methode an sich sind natürlich nur zur Veranschaulichung da und kein direktes Beispiel, sie sollen nur das Prinzip meines Ziels erläutern.



  • Wirklich niemand ne Idee?

    Dass es möglich ist weiß ich, nur nicht wie und ob sich der Arbeitsaufwand dafür lohnt, deswegen frage ich..



  • RussianTux schrieb:

    Wirklich niemand ne Idee?

    http://www.boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
    oder
    http://erdani.com/publications/inline_containers.html

    bzw. geht eine ellipse in dieser situation ja auch - da du nur primitive Typen uebergibst.



  • Klingt für mich, als würdest du reguläre Ausdrücke suchen. Generell halte ich es für zweifelhaft ob du wirklich einen (längeren) String 100500 mal von vorne bis hinten durchsuchen willst. Da könnte sich der Aufwand vielleicht lohnen, einen regex parser dafür aufzusetzen. Insbesondere wenn du mehr als nur einen String damit bearbeiten willst.



  • _matze schrieb:

    Und die Begriffe Argument und Parameter sind eigentlich gleichwertig (abgesehen von solchen Haarspaltereien).

    Warum Haarspaltereien? Ich hätte die Begriffe spontan ebenfalls so definiert. Ist doch sinnvoll, zwischen Aufrufer und aufgerufener Funktion zu unterscheiden...


Anmelden zum Antworten