std::tr1::function -> Funktionspointer



  • Hallo,
    Ich habe folgenden Code:

    typedef void (*FuncType)(void*);
    
    class Class {
        FuncType F;
        void foo(void *UserData) {/**/}
        void binde() {
            std::tr1::function<void(void*)> f = std::tr1::bind(&Class::Foo, this, std::tr1::placeholders::_1);
            F = f; //Fehler
        }
    };
    

    Der oben genannte Fehler ist, std::tr1::function könne nicht nach FuncType konvertiert werden.

    Wie kann man das Problem lösen?

    Danke schon im Voraus!

    mfg
    Mr X



  • Du kannst natürlich einem einfachen Funktionszeiger kein generisches Callable wie std::tr1::function zuweisen, dafür ist dieses viel zu komplex. Wenn du unbedingt einen Funktionszeiger brauchst, schreibe dir eine Funktion dafür. Aber wieso arbeitest du nicht gleich mit std::tr1::function weiter?



  • Ich würde zu gerne mit std::tr1::function weiterarbeiten. Leider will SFML einen normalen Funktionspointer.

    Kann man vielleicht mit bind1st die Memberfunktion binden und dies dann konvertieren?



  • Mr X schrieb:

    Leider will SFML einen normalen Funktionspointer.

    Wo genau brauchst du das? Bei sf::Thread ? Dort bestünde ja eine Alternative darin, von der Klasse zu erben.

    Mr X schrieb:

    Kann man vielleicht mit bind1st die Memberfunktion binden und dies dann konvertieren?

    Mit den Dingen aus <functional> kannst du nur Funktionsobjekte erzeugen, keine Funktionen. Das musst du in C++ nach wie vor von Hand erledigen.

    Aber du kannst dir ja statt von std::tr1::bind() einen Funktor erzeugen lassen eine eigene Funktion schreiben?

    // Packt die Aufrufklasse und die Daten zusammen
    struct Data
    {
        Class*     c; // Verweis auf deine Klasse
        ActualData d; // Deine eigentlichen Transportdaten (evtl. auch Zeiger)
    };
    
    void ThreadFunction(void* UserData)
    {
        Data* MyData = static_cast<Data*>(UserData);
        MyData.c->foo(MyData.d);
    }
    


  • Danke für die Antwort.

    Ich habe jetzt die UserData-Variable zur Übergabe des this-Zeigers verwendet und die Run-Methode statisch gemacht. Funktioniert jetzt.

    mfg
    Mr X


Anmelden zum Antworten