5

首先,一些背景:(
注意:虽然我在非 .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++ 没有类似的东西。

任何想法,将不胜感激。

4

1 回答 1

2

"100 distinct callbacks" is really the only thing you can do, thus you use the function address as identifying parameter. It might help to implement the different functions as template with a constant parameter:

template < unsinged N >
void StaticCbFcn( int value )
{
    map[ N ].InstanceCbFcn( value );
}
于 2012-07-20T16:22:58.323 回答