c++:当回调不提供用户参数时如何获取上下文?

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

本文关键字:何获取 获取 上下文 参数 回调 用户 c++      更新时间:2023-10-16

首先,一些背景:
(注意:虽然我在非.NET Win32领域,但这实际上是一个C++问题)

我使用的是第三方API,它要求您注册一个回调函数,以便知道异步操作何时完成。必须使用回调,没有办法绕过它。

非OOP实现是这样的:

void __stdcall MyCbFcn(int value)
{
   do something with 'value'...
}
API_RegisterCallback(MyCbFcn);

相当标准的东西

但是
我的代码是OOP,有多个实例在回调,因此回调需要路由到注册它的对象

知道人们会这样做,回调通常包括一个用户var,类似于:

void __stdcall MyCbFcn(int value, U32 user)
{
   do something with 'value'...
}
API_RegisterCallback(MyCbFcn, someUserValue);

更具体地说,当与OOP结合时,此用户参数允许您返回上下文:
(为简洁起见,以内联方式编写):

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没有用户参数:(

所以现在我的问题是:
我该如何回到上下文中?

我考虑过一些粗略的事情,比如定义一个由100个不同回调组成的"池",并在创建对象时分配它们,但这似乎是一个真正的破解

一个显而易见的解决方案。。。如果我在例如JavaScript:)。。。将使用匿名函数,但AFAIKC++没有类似的功能。

任何想法都将不胜感激。

"100个不同的回调"实际上是唯一可以做的事情,因此您使用函数地址作为标识参数。它可能有助于实现不同的功能作为模板与一个常数参数:

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

您可以使用boost-bind:来完成此操作

boost::bind(&my::function_to_call_cb, this, _1, context));
void my_impl::function_to_call_cb(int result, std::string context)