Dynamisch erstellen Sie eine Funktion Zeiger, ruft eine Methode auf einer bestimmten Instanz

Ich vermute, dass dies unmöglich ist, aber dachte, ich würde bitten. Sagen wir ich habe eine Klasse mit einer Methode:

class A {
public:
    void b(int c);
};

Kann ich einen Zeiger auf member-Funktion:

void (A::*ptr)(int) = &A::b;
(someAInstance.*ptr)(123);

Kann ich auch Missbrauch Funktionszeiger und einen Zeiger, der die A argument direkt (ich weiß nicht, ob dies sicher ist, aber es funktioniert auf meiner Maschine):

void (*ptr2)(A*, int) = (void (*)(A*, int))&A::b;
(*ptr2)(&someAInstance, 123);

Was ich wollen ist irgendwie curry die A argument, und erstellen Sie eine Funktion Zeiger, dauert nur ein int, fordert aber die A::b Methode auf einen bestimmten A Beispiel habe ich vordefiniert. Die A Instanz bleiben konstant für die jeweilige Funktion Zeiger, aber möglicherweise gibt es mehrere Funktionszeiger alle auf das gleiche A::b Methode, aber mit unterschiedlichen A Instanzen. Ich könnte zum Beispiel eine eigene wrapper-Funktion:

A* someConstantA = new A;
void wrapper(int c) {
    someConstantA->b(c);
}

void (*ptr3)(int) = &wrapper;

Jetzt kann ich mit ptr3 ohne zu wissen, welche besonderen A es ist die Versendung der Aufruf, aber ich hatte zu definieren, die eine spezielle Funktion zu behandeln. Ich brauche einen Weg, um Hinweise für eine beliebige Anzahl von A Instanzen, so kann ich nicht hartcodieren so. Ist dies in irgendeiner Weise möglich?


Bearbeiten: Sollte erwähnt haben, ich bin gefangen in C++03 land ist, und auch nicht die Verwendung von Boost

  • Es muss eine Funktion Zeiger? Was Sie tun möchten erfolgt oft über die Funktion von Gegenständen (z.B. mit std::bind).
  • Alles callable funktioniert; ich weiß nicht std::bind, jetzt zu Lesen
  • ^^^ oder boost::bind wenn Sie nicht über C++11.
  • Ein function-Objekt ist ein Objekt, das definiert operator() so können Sie es verwenden, wie eine Funktion. Intern kann es halten eine this Zeiger und Funktionszeiger. std::bind ist ein Weg, es zu tun, oder Sie können von hand die Rollen.
  • Ah, ich habe gerade festgestellt std::bind ist in c++11 auch, also ich kann es nicht verwenden (bearbeitet die Umwelt, ich bin stecken mit in der Frage). Ich glaube nicht, machen Sie eine Klasse, die operator(); das könnte der Weg, dies zu tun
  • (template -) Klasse, die operator() ist ein wirklich einfacher Weg zu gehen, IMO. Die etwas weniger leserlich Weg wäre, um typedef void (ptr2)(A, int) und ein makro verwenden.

Schreibe einen Kommentar