我想在类方法中做这样的事情。基本上,我有一个需要执行的代码片段,无论函数返回成功还是抛出异常。
class A {
private:
int b;
public:
void foo() {
bool bar = false;
// I want this to be executed when foo returns/throws.
auto callback = [&]() {
b = bar ? 1 : 2;
}
// logic that may have return/throws.
}
};
答案 0 :(得分:4)
与rlbond's comment中引用的ScopedGuard
类似,您可以拥有一个function_guard
来存储回调并在其析构函数中调用它:
#include <functional>
#include <type_traits>
template<class T>
struct function_guard {
template<class U, class... Args>
function_guard(U u, Args&&... args) : callback_(std::bind(u, args...)) { }
~function_guard() {
callback_();
}
private:
std::function<T> callback_;
};
答案 1 :(得分:1)
使用它类似于std :: lock_guard所做的事情。 创建一个在其构造函数中接受回调的对象,然后在其析构函数中执行回调。 e.g
class CallbackCaller{
(function pointer) ptr;
public:
CallbackCaller((function pointer) _ptr)
{
ptr = _ptr;
}
~CallbackCaller()
{
(*ptr)();
}
};
这样,当函数返回并且对象被销毁时,它将调用你的函数指针。您可以使用模板改进此类并使其可重用! 享受。