Funktion als Parameter übergeben



  • Ich möchte eine Funktion als Parameter übergeben, mir ist allerdings nicht ganz klar, wie man den Parameter genau hinschreiben muss.

    Die zu übergebende Funktion hat folgende Signatur:
    T bayReg_pNormal(Matrix <T> *a, T* b, T* x)



  • T (*func) (Matrix<T>*, T*, T*)
    


  • Gibt es eigentlich einen Grund, warum man meist einen Zeiger auf eine Funktion macht, statt einer Referenz?



  • @TE:

    Du kannst auch...

    T func (Matrix<T>*, T*, T*)
    

    oder

    std::function< T (Matrix<T>*, T*, T*)> func;
    

    Bzw.

    boost::function< T (Matrix<T>*, T*, T*)> func;
    

    schreiben.



  • Gugelmoser schrieb:

    Gibt es eigentlich einen Grund, warum man meist einen Zeiger auf eine Funktion macht, statt einer Referenz?

    Ja, weil man sich getreu der STL nicht auf Funktionszeiger festlegen will, sondern sonst immer den Typ mittels Templates offen lässt und so auch Funktionsobjekte erlaubt.

    Wenn man Funktionszeiger übergibt, hat das meistens mit C-Kompatibilität zu tun, und da gibt es keine Referenzen.



  • Hacker schrieb:

    @TE:

    Du kannst auch...

    T func (Matrix<T>*, T*, T*)
    

    Schlecht, denn man benutzt meistens keinen Funktionszeiger, sondern einen Funktor, wie ihn beispielsweise boost::bind erzeugt.

    Hacker schrieb:

    oder

    std::function< T (Matrix<T>*, T*, T*)> func;
    

    Bzw.

    boost::function< T (Matrix<T>*, T*, T*)> func;
    

    schreiben.

    Erfordern eine unnötige Speicheranforderung.

    Alle Fälle kann man abdecken, indem man den Typ der Funktion offenlässt und durch die Benutzung (und ggf. einen Kommentar) die Signatur vorschreibt.

    //F erfordert eine kompatible Signatur zu: T (Matrix <T> *, T* , T*)
    template <class T, class F>
    T mach_was_mit_matrix_und_funktion(Matrix<T> *m, const F &operation)
    {
    	return operation(m, nullptr, nullptr);
    }
    

Anmelden zum Antworten