c++:当回调不提供用户参数时如何获取上下文?
c++: How to obtain context when callback doesn't provide user arg?
首先,一些背景:
(注意:虽然我在非.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)
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 具有默认值的引用获取函数
- xmake总是报告:错误:无法获取cxx的程序,为什么
- OCI在不知道表结构的情况下获取获取的数据