Может ли указатель переместиться в контейнер? - PullRequest
0 голосов
/ 12 февраля 2019

Это продолжение этого вопроса, но я не хочу использовать пользовательское средство удаления.У меня есть следующий интерфейс:

struct Interface {
  Interface(const Interface &) = delete;
  auto operator=(const Interface &) -> Interface & = delete;
  ~Interface() = 0;
  protected:
    Interface() = default;
};

И реализация:

struct Implementation : public Interface {
  Implementation(Pool &p) : m_pool{p} {}
  Pool &m_pool;
};

У меня также есть пул реализаций:

struct Pool {
  auto get() -> std::unique_ptr<Interface>;
  std::vector<std::unique_ptr<Interface>> m_objects;
};

Мой вопрос, если этоВозможно ли Implementation, созданный как указатель на Interface, перемещаться в пул, когда вызывается его деструктор?

1 Ответ

0 голосов
/ 12 февраля 2019

Я думаю, что вы можете достичь этого, создав обертку.Это похоже на заимствование объекта из пула, который затем будет помещен обратно в пул, как только обернутый объект выйдет из области видимости.

struct PooledObject {
  PooledObject(Pool& pool, std::unique_ptr<Interface> object) 
        : m_object(std::move(object)), m_pool(pool) {}
  ~PooledObject() {
       m_pool.put(std::move(m_object));
   }
  // implement -> for easy access to underlying object
  std::unique_ptr<Interface> m_object;
  Pool& m_pool;
};

struct Pool {
  auto get() -> PooledObject;
  void put(std::unique_ptr<Interface> object);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...