c ++: Wie erhalte ich den Kontext, wenn der Rückruf kein Benutzerargument liefert?

Zunächst einige Hintergrundinformationen:
(Hinweis: Obwohl ich mich in einem Nicht-.NET-Win32-Land befinde, ist dies wirklich eine C ++ - Frage.)

Ich verwende eine Drittanbieter-API, für die Sie eine Rückruffunktion registrieren müssen, um zu erfahren, wann ein asynchroner Vorgang abgeschlossen ist. Muss den Rückruf nutzen, kommt nicht darum herum.

Eine Nicht-OOP-Implementierung würde ungefähr so ​​aussehen:

void __stdcall MyCbFcn(int value)
{
   do something with 'value'...
}

API_RegisterCallback(MyCbFcn);

Ziemlich normales Zeug.

ABER...
Mein Code ist OOP, wobei mehrere Instanzen den Rückruf empfangen, daher muss der Rückruf an das Objekt weitergeleitet werden, das ihn registriert hat.

In dem Wissen, dass die Leute dies tun, enthalten Rückrufe typischerweise eine Benutzervariable, so etwas wie:

void __stdcall MyCbFcn(int value, U32 user)
{
   do something with 'value'...
}

API_RegisterCallback(MyCbFcn, someUserValue);

In Kombination mit OOP ermöglicht Ihnen dieses Benutzerargument, wieder in den Kontext zurückzukehren:
(der Kürze halber inline geschrieben):

class MyClass
{
public:
   MyClass()
   {
      API_RegisterCallback(MyClass::StaticCbFcn, (U32)this);
   }

private:
   static void __stdcall StaticCbFcn(int value, U32 user)
   {
      MyClass* pThis = (MyClass*)user;
      pThis->InstanceCbFcn(value);
   }
   void InstanceCbFcn(int value)
   {
      ... do some work in context ...
   }
}

ABER, meine API enthält kein Benutzerargument :(

Also jetzt meine Frage:
Wie kann ich wieder in den Kontext kommen?

Ich habe ein bisschen skizzenhafte Dinge in Betracht gezogen, wie das Definieren eines "Pools" von 100 verschiedenen Rückrufen und das Zuweisen von Objekten, die erstellt werden, aber das scheint ein echter Hack zu sein.

Eine naheliegende Lösung ... wenn ich z. JavaScript :) ... würde eine anonyme Funktion verwenden, aber AFAIK C ++ hat so etwas nicht.

Irgendwelche Ideen würden geschätzt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage