C ++:如何获取上下文时回调不提供用户ARG?(c++: How to obtain contex

2019-07-30 12:41发布

首先,一些背景:
(注:虽然我在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 ++没有这样的事情。

任何想法,将不胜感激。

Answer 1:

“100个不同的回调”真的是你唯一可以做的事情,这样你用函数地址作为识别参数。 这可能有助于实现不同的功能与常量参数模板:

template < unsinged N >
void StaticCbFcn( int value )
{
    map[ N ].InstanceCbFcn( value );
}


文章来源: c++: How to obtain context when callback doesn't provide user arg?