gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:18 25 4
gpt4 key购买 nike

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

我正在使用第 3 方 API,它要求您注册一个回调函数以了解异步操作何时完成。必须使用回调,没有办法绕过它。

非 OOP 实现将是这样的:

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

API_RegisterCallback(MyCbFcn);

非常标准的东西。

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

知道人们这样做,回调通常包括一个用户变量,比如:

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 个不同回调的“池”并在创建对象时分配它们,但这似乎是一个真正的 hack。

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

如有任何想法,我们将不胜感激。

最佳答案

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

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

关于c++:当回调不提供用户参数时如何获取上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11583205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com