C++在回调函数面前是不是就是跪的命?
回调函数是不是根本就无法完美地封装到类中?在不修改提供回调函数的库的情况下。
因为现在用的某个库可能会换成其他的,所以就打算使用一个类间接地将这个库和自己的代码连接起来,弄到最后发现编译器一直报错,到网上一搜才发现这个好像很难解决,我搜索的是“类 回调函数”。
我就想问一下这个是不是无解的?要是无解的话我就不用类做间接接口了,直接用名字空间算了。
[解决办法]
网上有这样两篇文章:
基于Thunk实现的类成员消息处理函数
如何让API回调你的VC类成员函数而不是静态函数
如果出问题,问题很有可能就在调用约定上,这样得不偿失啊,强烈建议用其它方法,而技巧先搞明白再用.
[解决办法]
使用模板绕过编译器检查。
参考代码:
1.fastdelegate
2.chrome->callback.h
[解决办法]
回调函数不能有状态,这点很讨厌。
但是回调函数一般会有一个 void* 参数。
此时你就需要把状态通过void*传进去
[解决办法]
这个并不是C++独有的问题。 即使是C语言也一样。 比如典型的Win32窗口API中的窗口过程函数, 我们创建了3个相同的窗口并设置了相同的窗口过程函数。 现在在窗口过程函数中, 我们如何区分当前处理的是哪个窗口实例?
因此这其实是一个API设计上的瑕疵。 一个好的API在需要用户提供回调时,会允许用户同时提供一个关联的context。
而Win32 API没有,虽然有 SetWindowLong 之类的API可以实现类似的功能, 但因为SetWindowLong随时可以被调用,所以不能保证不被覆盖。
[解决办法]
用静态函数传入this指针进行操作
目前我是这样做的