Шаблон адаптера в C++ с использованием сочетания частного и публичного наследования
У меня есть вопрос о создании адаптера блокировки и, в более общем плане, шаблона адаптера со стилем реализации ниже. Реализация ниже основана на ответе в Правильном способе C++ реализации lock_guard для пользовательской библиотеки. Реализация полагается на публичное наследование нового интерфейса (в данном случае класса) и частное наследование унаследованного интерфейса. Однако, похоже, нет чистого способа передать lock_adapter в unique_lock, т. Е. Поскольку адаптированный_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)
}
Мой вопрос в том, есть ли способ получить исходную реализацию, которая использует сочетание частного и публичного наследования, которое потребует передачи частной базы в общедоступный базовый класс?