如何在c ++中返回函数时设置要执行的回调

时间:2015-06-04 23:42:54

标签: c++

我想在类方法中做这样的事情。基本上,我有一个需要执行的代码片段,无论函数返回成功还是抛出异常。

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.
  }
};

2 个答案:

答案 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)();
}
};

这样,当函数返回并且对象被销毁时,它将调用你的函数指针。您可以使用模板改进此类并使其可重用! 享受。