我有一个回调实现,其中未知的第三方在我的代码中调用函数指针。
但是,很多语言中的一个问题是在函数返回后触发代码。例如,当调用回调并且我必须删除调用对象(在这种情况下,重新初始化它)时,从回调返回会导致异常。
假设我无法挂钩并且我不拥有/无法修改调用回调的代码,在函数返回后执行代码的最佳方法是什么?
我能想到这样做的唯一真正方法是设置某种状态机并让工作线程检查状态。但是,我预见到的问题是竞争条件,在重置回调返回的时间和重置调用对象的点之间调用回调。
是否有任何我不了解的功能,或者这是否是实现此类结果的最有效方式?
答案 0 :(得分:1)
它需要c ++ 11或更新版本。但这就是我要做的。 您可以将其重写为使用函数指针,以便它可以在较旧的c ++版本上运行
#include <functional>
#include <iostream>
#define CONCACT_IMPL(x , y) x##y
#define CONCAT(x, y) CONCACT_IMPL(x, y)
#define deffered(x) auto CONCAT(__deffered, __COUNTER__) = Defer(x);
struct Defer {
Defer(std::function<void(void)> pFunc) : func(pFunc) {};
std::function<void(void)> func;
virtual ~Defer(){
func();
}
};
int main() {
deffered([] () {
std::cout << "deffered" << std::endl;
});
std::cout << "now" << std::endl;
}
输出 - &gt;
now
deffered