Variable Anzahl Parameter in einer Funktion



  • Hallo Leute,

    was ich machen möchte ist in einer Funktion mehrere Parameter nach folgendem Muster zu addieren:

    double foo(double x, double x2, double x3, double x4){
    
        return x+x2+x3+x4;
    
    }
    

    Die Sache ist jetzt die, dass erst zur Laufzeit bekannt ist, wieviele dieser Parameter in die Funktion eingehen. Da ich eine überschaubare maximale Anzahl an Argumenten habe, könnte man nun für jeden Fall eine Überladung schreiben. Ich frage mich ob es nicht eine simplere Möglichkeit gibt.

    Ich habe im Internet gefunden dass man sowas mit variadischen Funktionen realisiert werden kann. Spricht etwas dagegen sowas zu verwenden? Oder gibts vielleicht noch etwas einfacheres, das mir nicht einfällt?



  • Kennst du bereits Arrays bzw. std::vector?

    Das einfachste waere ein Array von Zahlen zu uebergeben und dann die Zahlen mit einer for-Schleife aufaddieren.

    Zum Beispiel so:

    double add(const std::vector<double> &vec)
    {
      double sum = 0.0;
      for ( size_t i = 0; i < vec.size(); ++i )
        sum += vec[i];
      return sum;
    }
    


  • Oder du bastelst dir einfach was mit den C++11 variadic templates, falls du schon Template kennst.



  • icarus2 schrieb:

    Kennst du bereits Arrays bzw. std::vector?

    Das einfachste waere ein Array von Zahlen zu uebergeben und dann die Zahlen mit einer for-Schleife aufaddieren.

    Zum Beispiel so:

    double add(const std::vector<double> &vec)
    {
      double sum = 0.0;
      for ( size_t i = 0; i < vec.size(); ++i )
        sum += vec[i];
      return sum;
    }
    

    seh ich ein wäre eigentlich ganz easy, könnte man machen

    Nathan schrieb:

    Oder du bastelst dir einfach was mit den C++11 variadic templates, falls du schon Template kennst.

    Ja daran hatte ich gedacht. Ich les allerdings immer das sei nicht zu empfehlen. Ich würde gerne Meinungen dazu lesen, warum und was di gefahren sind usw.



  • Spontan, fallen mir keine Gefahren ein.
    Es gibt höchstens das Problem des Rückgabetypes, aber das könnte man mit decltype lösen.
    Sicher, dass du das nicht mit den C-va_args verwechselst?



  • icarus2 schrieb:

    und dann die Zahlen mit einer for-Schleife aufaddieren.

    std::accumulate ftw


  • Mod

    daddy_felix schrieb:

    icarus2 schrieb:

    und dann die Zahlen mit einer for-Schleife aufaddieren.

    std::accumulate ftw

    Und das gibt uns auch die geeignete Signatur, wenn es nicht auf den speziellen Container ankommt:

    template<typename Iterator> ReturnType Foo(Iterator begin, Iterator end);
    

    Nichts vonwegen "geht nur mit std::vector" und erst recht nichts mit variadic templates!



  • Freddy_Kay schrieb:

    Nathan schrieb:

    Oder du bastelst dir einfach was mit den C++11 variadic templates, falls du schon Template kennst.

    Ja daran hatte ich gedacht. Ich les allerdings immer das sei nicht zu empfehlen. Ich würde gerne Meinungen dazu lesen, warum und was di gefahren sind usw.

    @Nathan & Freddy_Kay:
    Die Parameter-Anzahl ist erst zur Laufzeit bekannt.
    Denkt mal darüber nacht.
    Und dann will ich bitte einen Lösungsansatz mit Variadic Templates sehen, der nicht völliger Schwachsinn ist.



  • hustbaer schrieb:

    Die Parameter-Anzahl ist erst zur Laufzeit bekannt.
    Denkt mal darüber nacht.
    Und dann will ich bitte einen Lösungsansatz mit Variadic Templates sehen, der nicht völliger Schwachsinn ist.

    Der TE spricht von einer "maximale[n] Anzahl an Argumenten". Ich vermute, er hat einen Code in dieser Richtung:

    double a; bool use_a;
    double b; bool use_b;
    double c; bool use_c;
    double d; bool use_d;
    double e; bool use_e;
    double f; bool use_f;
    double durchschnitt = berechne_durchschnitt( < aller variablen V, für die use_V==true > );
    

    Da liesse sich schon etwas mit variadischen Templates machen.



  • Herr Vorahnung schrieb:

    ]Da liesse sich schon etwas mit variadischen Templates machen.

    mag sein. Fragt sich nur, ob das auch sinnvoll ist.



  • +1 für std::vector und std::accumulate...


Anmelden zum Antworten