Templatefunktion als Templateparameter



  • Ich hab paar Templatefunktionen mit der gleichen Signatur:

    template <typename T>
    void funcA();
    
    template <typename T>
    void funcB();
    

    Jetzt habe ich eine etwas längere Funktion, die eine dieser Funktionen mit einem Typen, den sie kennt, instanziieren müsste. Pseudocode:

    template <typename Func>
    void process()
    {
      //code
      ...
      if (...) {
        Func<int>();
      }
    }
    

    Es gibt sagen wir so 10 Funktionen, die hier in Frage kommen, und die sollten an process als Parameter übergeben werden, und process instanziiert sie dann mit verschiedenen Typen.
    Ich wüsste grad nicht, wie ich das vereinheitlichen könnte, außer mit einem Macro. Irgendwelche Ideen?



  • Du kannst Templates als Templateargumente übergeben. Schau mal hier: http://en.cppreference.com/w/cpp/language/template_parameters



  • Was hat es mit meiner Frage zu tun?



  • Du hast 10 Funktionstemplates, die du jeweils an 'process' übergeben möchtest, welche dort instanziiert und aufgerufen werden. Richtig? Inwiefern ist meine Antwort unpassend? Auf der Seite wird unter anderem gezeigt, wie (Funktions-)Templates wiederum als Templateargument benutzt werden können.



  • Techel schrieb:

    Du hast 10 Funktionstemplates, die du jeweils an 'process' übergeben möchtest, welche dort instanziiert und aufgerufen werden. Richtig?

    Mir ist nicht klar, wie das mit Funktionen gehen soll... Wenn das eine Klasse wäre, wärs ja kein Problem. Kann aber auch sein, dass ich grad komplett auf dem Schlauch stehe.
    Wenn dir das klar ist, kannst du ein konkretes Beispiel zusammenschreiben? Dann seh ichs evtl. auch, wenn wir aneinander vorbeigeredet haben.



  • template<typename Func, typename... Args>
    void f(Func&& fx, Args&&... arguments){
        fx(std::forward<Args>(arguments)...);
    }
    

    So kannst du jede beliebige Funktion, mitsamt seinen Argumenten an eine Funktion übergeben.
    Vorausgesetzt du benutzt C++11.

    Du kannst auch std::function mit std::bind benutzen.
    Das sieht dann so aus:

    #include <functional>
    
    void f(std::function<void()> fx){
        fx();
    }
    
    void f1(int) {}
    void f2(int, float) {}
    template<typename> void f3(int) {}
    
    int main(){
        f(std::bind(f1, 10));
        f(std::bind(f2, 10, 10.f));
        f(std::bind(f3<int>, 10));
    }
    


  • Das ganze soll jedoch sicher statisch zur Compilierzeit sein.
    Ich war wohl doch etwas voreilig, mit Funktionstemplates als Templateargument geht es doch nicht so wie gewollt. Du musst somit die Funktion in eine Klasse wrappen, aber das sollte sicher kein Problem sein: http://ideone.com/wb5VDa



  • electronics schrieb:

    ...

    Ist schon klar. Ich hab aber nicht "die ganze" Funktion. Ich weiß grad ehrlich gesagt nicht, was die richtigen Bezeichnungen dafür wären...
    Bei einem f<int> habe ich das f, das will ich übergeben, und die Funktion an die ich das übergebe, kennt das int, ich aber nicht.

    Techel schrieb:

    Du musst somit die Funktion in eine Klasse wrappen, aber das sollte sicher kein Problem sein

    Ich glaub, das geht... Das war glaub ich genau mein Denkfehler.
    Das Problem ist, und das hatte ich nicht erwähnt, ich will die Funktion nicht aufrufen, ich brauche dann den Funktionszeiger. Deswegen bin ich nicht auf die Lösung gekommen, das in eine Klasse zu wrappen. Aber wenn ich die Funktion in der Klasse statisch mache, sollte das mit dem Funktionszeiger immer noch passen.

    Danke!


Anmelden zum Antworten