首先,一些背景:
(注:虽然我在non-.NET Win32的土地来的,这的确是一个C ++的问题)
我使用的是第三方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个不同的回调“池”,并作为创建对象赋予它们有点粗略的事情,但似乎像一个真正的黑客。
一个显而易见的解决方案......如果我是如JavaScript的:) ...是使用匿名函数,但据我所知C ++没有这样的事情。
任何想法,将不胜感激。