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