std::tr1::function und Funktor



  • Hallo Forum,

    ich habe gewisse Probleme damit, einer std::tr1::function einen Funktor zuzuweisen... Vielleicht könnt ihr mir ja helfen...

    #include <functional>
    #include <iostream>
    using namespace std;
    
    typedef std::tr1::function< int (int, int) > Signature;
    
    // ... MyFunctor
    // ... MyFunction
    
    int main() {
        Signature s1(MyFunctor()), // Fehler!
                  s2(MyFunction);
    
        cout << s1(1, 2) << endl;
        cout << s2(1, 2) << endl;
    }
    

    Sieht jemand was ich falsch mache?



  • Unheimlich praktisch wäre es, die Definition von MyFunctor zu wissen. Sonst müsste ich die Glaskugel ausgraben und das ist ein Billigteil...



    1. Was meinst du mit "Probleme"?
    2. Ohne die Deklaration von MyFunctor wird man dir wohl nur schwer helfen können.


  • Eigentlich nix besonderes...

    class MyFunctor : public std::binary_function< int, int, int > {
    public:
        int operator () (int i, int j) const {
            return i + j;
        }
    };
    


  • Ich vermute, dass

    Signature s1(MyFunctor())
    

    für den Compiler wie eine Funktionsdeklaration aussieht. Versuch mal

    MyFunctor f;
    Signature s1(f);
    


  • seldon schrieb:

    Ich vermute, dass

    Signature s1(MyFunctor())
    

    für den Compiler wie eine Funktionsdeklaration aussieht. Versuch mal

    MyFunctor f;
    Signature s1(f);
    

    Oder das:

    Signature s1 = MyFunctor();
    


  • Hmm...
    so funktionierts auch:

    Signature s = Signature(MyFunctor())
    

    Warum geht das? aber nicht:

    Signature s(MyFunctor())
    


  • daersc schrieb:

    Signature s(MyFunctor())
    

    Vergleiche:

    MyFunctor f;
    Signature s(MyFunctor()); // <--
    
    s(f); // <-- Aufruf der _Funktion_ s
    

    Alles, was wie eine Funktionsdeklaration interpretiert werden könnte, ist auch eine Funktionsdeklaration.


  • Mod

    Signature s(MyFunctor());
    

    Das deklariert eine Funktion f, die ein Signatureobjekt zurückgibt und als Argument einen Zeiger auf eine parameterlose Funktion, die ein MyFunctor zurückgibt, erwartet. Abhilfe können z.B. zusätzliche Klammern bieten:

    Signature s((MyFunctor()));
    

Anmelden zum Antworten