我有一个图书馆,我可能不会改变它的来源。它有一个包含函数指针的结构,该指针是某个事件的回调。考虑:
// library code (.h file)
typedef int (callback_function)(int arg1, double arg2);
struct callbacks_struct
{
...
callback_function *callback;
...
};
我正在为这些低级的东西编写一个 C++ 包装器。考虑我有一堂课:
class Wrapper
{
public:
int Callback(int arg1, double arg2);
};
现在我想Wrapper::Callback
在创建结构时绑定以用作回调callback_struct
:
struct callback_struct x[] =
{
{
...
// put a Wrapper::Callback as a callback
...
},
{0, 0, 0, 0}
}
显然,如果没有一些中间功能,这是无法做到的。一种方法是创建一个Wrapper
类的全局对象并使用它:
std::shared_ptr<Wrapper> gWrapper;
void foo()
{
struct callback_struct x[] =
{
{
...
my_plain_callback,
...
},
{0, 0, 0, 0}
}
}
int my_plain_callback(int arg1, double arg2)
{
return gWrapper->Callback(arg1, arg2);
}
但我需要一个线程安全的解决方案,所以在这种情况下使用全局变量似乎是问题的根源。
有谁知道更好的解决方案?
谢谢。