首先,一些背景:(
注意:虽然我在非 .NET Win32 领域,但这确实是一个 C++ 问题)
我正在使用第 3 方 API,它要求您注册回调函数才能知道异步操作何时完成。必须使用回调,没有办法。
非 OOP 实现将是这样的:
void __stdcall MyCbFcn(int value)
{
do something with 'value'...
}
API_RegisterCallback(MyCbFcn);
很标准的东西。
但是...
我的代码是 OOP,有多个实例 rx'ing 回调,因此回调需要路由到注册它的对象。
知道人们会这样做,回调通常包括一个用户变量,例如:
void __stdcall MyCbFcn(int value, U32 user)
{
do something with 'value'...
}
API_RegisterCallback(MyCbFcn, someUserValue);
更具体地说,当与 OOP 结合使用时,此用户 arg 允许您返回上下文:(
为简洁起见,内联编写):
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 ...
}
}
但是,我的 API 没有用户 arg :(
所以现在我的问题是:
我如何才能回到上下文中?
我考虑过一些粗略的事情,比如定义一个包含 100 个不同回调的“池”并将它们分配为创建对象,但这似乎是一个真正的 hack。
一个明显的解决方案......如果我在例如 JavaScript :) ... 将使用匿名函数,但 AFAIK C++ 没有类似的东西。
任何想法,将不胜感激。