Шаблон адаптера в C ++ с использованием сочетания частного и публичного c наследования - PullRequest
0 голосов
/ 02 мая 2020

У меня есть вопрос о создании адаптера блокировки и, в более общем смысле, шаблона адаптера со стилем реализации ниже. Приведенная ниже реализация основана на ответе Надлежащего 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 базовый класс?

...