0

我有一个关于创建锁适配器的问题,更一般地说是具有以下实现风格的适配器模式。下面的实现基于 Proper C++ way of implementation a lock_guard for custom library中的答案。实现依赖于新接口(在本例中为类)的公共继承和旧接口的私有继承。然而,似乎没有一种将lock_adapter 传递给unique_lock 的干净方法,即因为adapted_unique_lock不是作者可能想要的lock_adapter,即这不会编译。

template<class T>
struct lock_adapter {
  T* t = nullptr;
  void lock() { t->Lock(); }
  void unlock() { t->Unlock(); }
  lock_adapter( T& tin ):t(std::addressof(tin)) {}
  // default some stuff if you like
};

template<class T>
struct adapted_unique_lock:
  private lock_adapter<T>,
  std::unique_lock< lock_adapter<T> >
{
  template<class...Args>
  adapted_unique_lock(T& t, Args&&...):
    lock_adapter<T>(t),
    std::unique_lock< lock_adapter<T> >( *this, std::forward<Args>(args)... )
  {}
  adapted_unique_lock(adapted_unique_lock&&)=delete; // sadly
  friend void swap( adapted_unique_lock&, adapted_unique_lock& ) = delete; // ditto
};

对于这个特定的实例,做一些简单的事情而不是像下面这样直接适应unique_lock。

struct L1
{
    void Lock(){}
    void Unlock() {}
};


 void test()
 {
     L1 l;
     lock_adapter<L1> l_adapt(l);
     unique_lock<lock_adapter<L1>> u(l_adapt)
 }

我的问题是,是否有一种方法可以获得使用私有和公共继承混合工作的原始实现,这需要将私有基类传递到公共基类中?

4

0 回答 0