c ++: Como obter contexto quando o callback não fornece user arg?
Primeiro, alguns antecedentes:
(Nota: Embora eu esteja em uma região não-.NET Win32, esta é realmente uma questão em C ++)
Estou usando uma API de terceiros que exige que você registre uma função de retorno de chamada para saber quando uma operação assíncrona é concluída. Tenho que usar o retorno de chamada, não há maneira de contornar isso.
Uma implementação não OOP seria algo assim:
void __stdcall MyCbFcn(int value)
{
do something with 'value'...
}
API_RegisterCallback(MyCbFcn);
Coisas bastante padrão.
MAS...
Meu código é OOP, com várias instâncias rx'em o retorno de chamada, portanto, o retorno de chamada precisa ser roteado para o objeto que registrou.
Sabendo que as pessoas fazem isso, os retornos de chamada geralmente incluem um usuário var, algo como:
void __stdcall MyCbFcn(int value, U32 user)
{
do something with 'value'...
}
API_RegisterCallback(MyCbFcn, someUserValue);
e, mais especificamente, quando combinado com o OOP, esse argumento de usuário permite que você retorne ao contexto:
(escrito inline por brevidade):
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 ...
}
}
MAS, minha API não possui um user arg :(
Então agora minha pergunta:
Como eu posso voltar ao contexto?
Eu considerei coisas meio modestas como definir um "pool" de 100 callbacks distintos e atribuí-los como objetos são criados, mas isso parece um hack real.
Uma solução óbvia ... se eu estivesse em, e. JavaScript :) ... seria usar uma função anônima, mas o AFAIK C ++ não tem nada disso.
Qualquer idéia seria apreciada.