function -object/pointer als template argument



  • Hi,

    ich probier mal mein Problem so kurz wie möglich zu beschreiben

    template<T , SOMETHING>
    SOMETHING::return_value run(T val, SOMETHING f) { return f(val) }
    

    SOMETHING kann sein
    Function porinter
    Function object (std::function, Functor)
    oder was immer mir std::bind zurückgibt.

    die Frage ist also, was ist SOMETHING?

    geht das überhaut?


  • Mod

    geht das überhaut?

    Nein, nicht so wie in deinem Codeschnipsel.

    Suchst du

    template< typename T, typename Func >
    auto run(T&& val, Func f) -> decltype(f(std::forward<T>(val))) { return f(std::forward<T>(val)); }
    

    ?



  • kurze_frage_atwork schrieb:

    mein Problem

    Wo kommt sowas denn vor?



  • kkaw schrieb:

    kurze_frage_atwork schrieb:

    mein Problem

    Wo kommt sowas denn vor?

    Vergiss es. Hatte einen Knoten im Kopf. Das einzig komplizierte dran ist der Returntyp. Dafür kann man decltype und ggf auch declval verwenden, wie es Arcoth zeigte. Für Funksionsaufrufe als Ausdrücke gibt es allerdings extra ein type trait: result_of

    #include <type_traits>
    
    template<class T, class F>
    typename std::result_of<F(T)>::type run(T val, F f)
    {
       return fun(val);
    }
    

    In C++11 würde ich das aber vermeiden, weil es nicht "SFINAE-kompatibel" ist und das typename ... type nervt da auch etwas.

    Ab C++14 sieht das aber besser aus:

    #include <type_traits>
    
    template<class T, class F>
    std::result_of_t<F(T)> run(T val, F f)
    {
       return fun(val);
    }
    

    Bzgl SFINAE ist das auch so in Ordnung ab C++14.



  • Den Rückgabetyp kann man in C++14 einfacher angeben:

    #include <type_traits>
    
    template<class T, class F>
    decltype(auto) run(T val, F f)
    {
       return fun(val);
    }
    

  • Mod

    @kkaw: Seit C++14 haben wir placeholder-Typen als Rückgabetypen ohne trailing-return-type, wozu result_of ? Dass ersteres kein SFINAE unterstützt, ist nicht so schlimm.



  • TyRoXx schrieb:

    Den Rückgabetyp kann man in C++14 einfacher angeben:

    decltype(auto)
    

    Ja stimmt. Hatte ich verdrängt. Wisst ihr denn auch, wie das mit SFINAE zusammenspielt? Ich hatte da noch nicht drüber nachgedacht/es nachgeguckt.

    Arcoth schrieb:

    Dass ersteres kein SFINAE unterstützt, ist nicht so schlimm.

    Hätte ich die SFINAE Sache nicht erwähnt, hättest Du mich bestimmt drauf aufmerksam machen wollen. 😉


  • Mod

    Wisst ihr denn auch, wie das mit SFINAE zusammenspielt? Ich hatte da noch nicht drüber nachgedacht/es nachgeguckt.

    Da der Ausdruck der zurückgegeben wird ja im Funktionsrumpf steht, greift SFINAE nicht.



  • vielen Dank für die Antworten!

    ich glaub das hilft mir in die richtige Richtung und ich komm weiter


Log in to reply