【问题标题】:C Library Callback in C++ without pointer to "this"C ++中的C库回调,没有指向“this”的指针
【发布时间】:2016-12-31 03:12:55
【问题描述】:

我在这里有一个 C 库,我想将它封装在 C++ 类中。该库异步工作,需要设置错误处理程序。我知道如何在 C 库的静态类函数中包装错误处理程序,但我习惯于使用 void *user_data 指针之类的东西,我可以将 this 放入其中以从静态 thunk 调用成员函数。

有没有办法直接为成员函数注册回调,因为这个库没有指向某些用户数据的指针?

【问题讨论】:

    标签: c++ callback


    【解决方案1】:

    您可以将它包装在您自己的静态函数中,该函数知道要对其进行操作的某个全局(或静态本地)对象。如果需要,您甚至可以将此函数设为静态方法,但是如果不提供要调用该方法的对象,则不能调用对象上的方法。

    编辑:想了一会儿,也许有办法。您可以通过拥有由线程 id 索引的状态集合的全局集合来模拟线程本地存储。在每个线程绑定的状态集合中,您可以保留调用对象的堆栈/队列(取决于数据的处理方式)。回调可以查找存储的队列(因为回调知道它正在运行的线程 ID)。这将允许您强制单线程框架对多个数据流进行操作。

    【讨论】:

    • 嗯,我是这么认为的。问题是这只有在我得到对象的 1 个实例时才有效。这将与多个实例混淆:(
    • 你想要发生什么?从概念上讲,一个在运行时不接受输入的函数必须在编译时对该“输入”进行硬编码。您可以添加一些跟踪机制,但如果您收到的回调不关心谁注册了它们,那么您能做的最好的事情就是拥有一个独立的回调处理程序池。
    • 顺便说一句,您应该确保您没有使问题过于复杂。您确定框架不依赖您预先注册一些全局状态数据结构吗?它们可能不会直接传递给回调,但如果框架内保存了全局状态,则可以依靠流处理在一个线程中完成。然后,您可以保留一个全局堆栈/数据队列,您的回调可以一次处理一个。
    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多