Funktionszeiger auf Member, nicht static



  • Auf der Suche nach einer schönen und allgemeinen Lösung für das "Funktionszeiger auf Member"-Problem habe ich nur die beiden Workarounds mit static member und wrapper gefunden. Ich möchte das ganze aber für jede Memberfunktion(mit entsprechender Signatur) machen können. Jetzt habe ich erstmal sowas gebastelt:

    //Beispielklasse
    class CPlayer {
    public:
    	void move() {}
    };
    
    //Funktion und Taste verbinden(jetzt einfach Global, aber später in einer anderen Klasse)
    template<typename T>
    void AssignKeyToMemberFunction(int Key, T* const This, void (T::*const pToMember)(void)) {
    	//...
    	(This->*pToMember)();//Wie kann ich das zwischenspeichern und später aufrufen?
    }
    
    int main() {
    	CPlayer PlayerOne;
    	int Key=VK_LEFT;
    	AssignKeyToMemberFunction<CPlayer>(Key, &PlayerOne, &CPlayer::move);
    }
    

    Durch das Template decke ich alle Klassen ab.
    Die Memberfunktionen sind auf die Signatur void foo(void)() beschränkt, ist aber nicht so wild.

    Mir fehlt quasi nurnoch das Abspeichern des Zeigers, da hakt es aber.
    Wenn ich es als void* speicher kenne ich den Typ nicht mehr und kann auch kein "->" verwenden. Und den Typ selber kann ich mir auch nicht abspeichern(oder doch?)
    Jemand eine Idee?



  • boost::bind + boost::function

    struct Some
    {
       R doIt(T1 p1, T2 p2){ ... }
    };
    
    //...
    
    Some some;
    boost::function<R (T1, T2)> functor = boost::bind(&Some::doIt, &some, _1, _2);
    functor(bla, blub); // some.doIt(bla, blub)
    

    PS: Evtl. unterstützt Dein Compiler auch schon tr1. Dann brauchst Du nichtmal boost dafür. Zu finden ist das Zeugs im Header <functional> oder <tr1/functional> .



  • Willst du da zum üben was selber basteln oder kennst du einfach die Binder aus <functional> oder boost nicht ( std::mem_fun, boost::bind, std::bind )?



  • Ich habe bei mir nicht mit boost::function sondern mit std::function gearbeitet, weshalb ich gernen wissen will, ob letzteres schon zum Standard gehört oder nur "tr"-like vorhanden ist:

    std::map<std::string, std::function<void(boostOptions::variable_value)>> functors;
    

    Hierbei habe ich eine Map mit Strings als Keys auf Funktionspointer hergenommen, die ich dynamisch über Prädikate als Lamda-Expressions an eine Funktion übergebe, die diese speichert bzw. verwaltet :p

    // EDIT: Bei mir werden Funktionen der Form void foo(boost::program_options::variable_value); gespeichert, was jetzt meinen Gebrauch erklärt 😃



  • von boost::bind hab ich schon was gehört, aber noch nix damit gemacht.

    Die <functional> header hab ich grad versucht einzubinden(erfolgreich).
    Müsste ich mir mal näher ansehen, allerdings bin ich immernoch an einer "zufuß" Lösung interessiert. Ich würde es gerne zur Übung und besserem verständnis selbst schreiben.

    Donksche!



  • Hier gibt es eine mögliche Lösung mit Beispiel.



  • Tachyon schrieb:

    Hier gibt es eine mögliche Lösung mit Beispiel.

    Yes! Genau das was ich gesucht habe, danke.
    Jetzt mal nachforschen was delegate so alles kann 🙂



  • Hehe, genial!
    Stimmt der Kommentar von me65535 in dem verlinkten Artikel? Also darf man laut Standard die Stub-Zeiger vergleichen?


Anmelden zum Antworten