Funktionen als Parameter und Rückgabewerte



  • Es geht um folgendes:
    Ich möchte eine Funktion randDouble(int min, int max) schreiben, die eine Funktion (int -> double) zurückgibt.

    Ich möchte eine zufällige Matrix erzeugen mit:

    Matrix <double> mat = Matrix <double>(10,10, randDouble(-1,1));
    

    Der Konstruktor sieht wie folgt aus:

    template<class T>
    Matrix<T>::Matrix(int dim1, int dim2, T (*rnd)(int)) {
    	dim1_ = dim1;
    	dim2_ = dim2;
    	entries_ = new T*[dim1_];
    	for (int i = 0; i < dim1_; i++)
    		entries_[i] = new T[dim2_];
    	for (int i = 0; i < dim1_; i++) {
    		for (int j = 0; j < dim2_; j++) {
    			entries_[i][j] = rnd(rand());
    		}
    	}
    }
    

    Ich weiß nicht, ob sowas überhaupt mit C++ geht. Mit Haskell würde ich einfach eine Funktion f :: Int -> Int -> Int -> Float schreiben und nur 2 Parameter beim Aufruf angeben. Aber bei C++ hab ich keine Ahnung, wie die Implementierung von

    double (*randDouble(int min, int max))(int)
    

    aussehen muss.



  • Kleine Ergänzung:

    Es macht mehr Sinn, wenn die Parameter vom Typ double sind, aber dadurch ändert sich das Problem nicht:

    double (*randDouble(double min, double max))(int)
    


  • Man würde hier eher eine Instanz einer Generator-Klasse übergeben. Denn das Problem ist, dass du zusätzlich zum Funktionszeiger ja noch die Parameter brauchst.



  • Ja, ok, das würde gehen, thx, hätte ich auch selbst kommen können.



  • Mit min und max als ints würde es tatsächlich gehen:

    template <int min, int max> double randDouble(int) { ... }
    


  • std::function<double()> make_me_a_generator_in_range(int min, int max)
    

Anmelden zum Antworten