我有一个关于创建锁适配器的问题,更一般地说是具有以下实现风格的适配器模式。下面的实现基于 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)
}
我的问题是,是否有一种方法可以获得使用私有和公共继承混合工作的原始实现,这需要将私有基类传递到公共基类中?