[solved] function-template als function parameter verwenden



  • Hallo zusammen,
    ich bin derzeit dabei C++ zu lernen und habe einen Fall, bei dem ich derzeit nicht weiterkomme. Habe leider auch keine Lösung im Netz gefunden. Was ich möchte ist folgendes: Eine Funktion, die als Parameter eine Funktion erhält, die wiederum als Parameter einen Vector erhält. Die Typen des Vectors soll dabei unabhängig sein. Bisher habe ich folgendes probiert:

    template <typename T>
    vector<T> sort(void sortfunction(vector<T> & data),vector<T> & data) {
    	....
    	sortfunction(data);
    	....
    	return data;
    }
    

    In der sort-Funktion passiert halt noch etwas. In diesem Fall wird die Zeit gestoppt.
    Eine sortfunction sieht so aus:

    template <typename T>
    void insertionSort(vector<T> &a) {
    .....
    }
    

    Und dann ein Aufruf:

    sort(insertionSort,vTestdata)
    

    Fehler 2 error C2896: "std::vector<T> sort(void (__cdecl *)(std::vector<T> &),std::vector<T> &)": Funktions-template "void insertionSort(std::vector<T> &)" kann nicht als Funktionsargument verwendet werden. c:\...\main.cpp 174

    Wäre super wenn mir da einer helfen könnte.



  • Bart Simpson schrieb:

    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.
    Es heißt function-template.



  • Da fehlt eine Typangabe:

    sort(insertionSort< Typ >,vTestdata)
    


  • Das ist keine template function, sondern eine function template (Funktionsvorlage). Diese kann man nicht in der Form herumreichen, wie du es dir vorstellst.

    Du kannst aber aus der Vorlage eine Funktion stanzen und diese herumreichen. Wenn ich das richtig im Kopf habe:

    std::vector<int> v;
    
    sort(insertionSort<int>, v);
    

    Auch denkbar wäre, mit Funktionsobjekten zu arbeiten. Etwa

    template<typename sorter_t, typename T>
    vector<T> sort(sorter_t sortfunction, vector<T> &data) {
      ...
    }
    
    struct insertion_sorter {
      template<typename T>
      void operator()(vector<T> &a) const {
        ...
      }
    };
    
    ...
    
    sort(insertion_sorter(), v);
    


  • TyRoXx schrieb:

    Da fehlt eine Typangabe:

    sort(insertionSort< Typ >,vTestdata)
    

    Super, vielen Dank, das war die Lösung des Problems 😃
    Jetzt läuft es durch. 👍



  • Das Problem ist hier, dass die Template-Argument-Deduction mit dem als Funktionsparameter übergebenen Funktionstemplate nicht klar kommt. Entweder sagt man genau, welche Spezialisierung man verwenden will, oder man schaltet die Template-Argument-Deduktion für den ersten Parameter mit etwas Hilfe (id<>) aus.


Anmelden zum Antworten