【发布时间】:2016-12-31 03:12:55
【问题描述】:
我在这里有一个 C 库,我想将它封装在 C++ 类中。该库异步工作,需要设置错误处理程序。我知道如何在 C 库的静态类函数中包装错误处理程序,但我习惯于使用 void *user_data 指针之类的东西,我可以将 this 放入其中以从静态 thunk 调用成员函数。
有没有办法直接为成员函数注册回调,因为这个库没有指向某些用户数据的指针?
【问题讨论】:
我在这里有一个 C 库,我想将它封装在 C++ 类中。该库异步工作,需要设置错误处理程序。我知道如何在 C 库的静态类函数中包装错误处理程序,但我习惯于使用 void *user_data 指针之类的东西,我可以将 this 放入其中以从静态 thunk 调用成员函数。
有没有办法直接为成员函数注册回调,因为这个库没有指向某些用户数据的指针?
【问题讨论】:
您可以将它包装在您自己的静态函数中,该函数知道要对其进行操作的某个全局(或静态本地)对象。如果需要,您甚至可以将此函数设为静态方法,但是如果不提供要调用该方法的对象,则不能调用对象上的方法。
编辑:想了一会儿,也许有办法。您可以通过拥有由线程 id 索引的状态集合的全局集合来模拟线程本地存储。在每个线程绑定的状态集合中,您可以保留调用对象的堆栈/队列(取决于数据的处理方式)。回调可以查找存储的队列(因为回调知道它正在运行的线程 ID)。这将允许您强制单线程框架对多个数据流进行操作。
【讨论】: