dlc*_*ers 5 c++ scope callback
首先,一些背景知识:(
注意:虽然我在非.NET Win32领域,但这确实是一个C++问题)
我正在使用第三方API,它要求您注册回调函数,以便知道异步操作何时完成.必须使用回调,没有办法解决它.
非OOP实现将是这样的:
void __stdcall MyCbFcn(int value)
{
do something with 'value'...
}
API_RegisterCallback(MyCbFcn);
Run Code Online (Sandbox Code Playgroud)
很标准的东西.
但是......
我的代码是OOP,有多个实例rx'回调,因此回调需要路由到注册它的对象.
知道人们这样做,回调通常包括用户var,如:
void __stdcall MyCbFcn(int value, U32 user)
{
do something with 'value'...
}
API_RegisterCallback(MyCbFcn, someUserValue);
Run Code Online (Sandbox Code Playgroud)
更具体地说,当与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 ...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我的API没有用户arg :(
所以现在我的问题是:
如何重新回到上下文中?
我已经考虑了一些粗略的事情,比如定义一个包含100个不同回调的"池",并将它们分配为对象,但这似乎是一个真正的黑客.
一个明显的解决方案......如果我在例如JavaScript :) ...将使用匿名函数,但AFAIK C++没有这样的东西.
任何想法,将不胜感激.
“100 个不同的回调”实际上是您唯一能做的事情,因此您使用函数地址作为标识参数。它可能有助于使用常量参数将不同的函数实现为模板:
template < unsinged N >
void StaticCbFcn( int value )
{
map[ N ].InstanceCbFcn( value );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
822 次 |
| 最近记录: |