如何创建类似于boost::lock_guard的保护

how to create guard similar to boost::lock_guard

本文关键字:lock guard 保护 boost 类似于 何创建 创建      更新时间:2023-10-16

我想创建一个守卫,它在构造时锁定函数,在销毁时解锁它,例如用falsetrue调用函数。

class A {
void enable( bool flag );
};

在另一个方法中,我想使用:

A::anotherMethod( ... ) {
  block_guard(A::enable); // now A::enable(false)
  // some operation
} // now A::enable(true)

我的想法:

使用模板

template < class T >
class block_guard {
  T t_;
public:
  block_guard( T& t ) : t_(t) {
    t_(false);
  }
  ~block_guard() {
    t_(true);
  }
};

的问题是,如何实例化模板?也许用boost::bind ?

使用boost::函数

class block_guard {
  typedef boost::function< void (bool) > T;
  T t_;
public:
  block_guard( T& t ) : t_(t) {
    t_(false);
  }
  ~block_guard() {
    t_(true);
  }
};

这工作得很好,但是调用

似乎非常复杂。
block_guard bg(boost::function< void (bool) >(boost::bind(&A::enable, pointer-to-A, _1));

任何想法?也许还有另一种更简单的方法?

首先,认识到成员函数并不是您所需要的全部;您还需要调用它的对象。在c++中,在函数中创建的对象没有办法隐式地捕获当前的this指针。

我假设你没有可用的c++ 11。如果需要,使用第二个解决方案和lambda表达式是最简单的。

现在,如果您不关心boost::函数对性能的轻微影响(您不应该关心),第二个解决方案是好的,但是我会稍微修改它,通过将绑定拉入构造函数使其更方便使用。

class block_guard {
  typedef boost::function< void (bool) > block_fn;
  block_fn block_fn_;
public:
  // For non-member functions and function objects:
  template <typename Fn>
  block_guard(Fn fn) : block_fn_(fn) {
    block_fn_(false);
  }
  // For member functions:
  template <typename T, typename Ret>
  block_guard(T* obj, Ret (T::*fn)(bool)) : block_fn_(boost::bind(fn, obj, _1)) {
    block_fn_(false);
  }
  ~block_guard() {
    block_fn_(true);
  }
};

用法:

block_guard guard(this, &A::enable);

我在这里使用了一个Ret形参,因为没有理由不允许函数返回一些东西——返回值将被简单地忽略。

如果你不想要boost::function,这个东西将变得不那么容易使用,因为你必须模板块保护。因此,为成员函数专门创建一个block_guard就变得很有用了。你也失去了使用非void函数的能力。

template <typename T>
class block_guard {
  typedef void (T::*block_fn)(bool);
  T* obj_;
  block_fn block_fn_;
public:
  block_guard(T* obj, block_fn fn) : obj_(obj), block_fn_(fn) {
    (obj_->*block_fn_)(false);
  }
  ~block_guard() {
    (obj_->*block_fn_)(true);
  }
};

用法:

block_guard<A> guard(this, &A::enable);

是的,有一个更简单的方法,忘记模板、通用的东西和任何不必要的东西,专注于任务。

你所需要的只是一个有一个actor和一个doctor的类。先给医生写信,这能让你知道你需要做什么。然后编写该actor,根据需要获取参数。最后,删除不需要的函数(cctor, op=)。做。

不是通用的,但直截了当。