Существует ли уникальный в своем роде владелец объектов, выделенных в куче? - PullRequest
1 голос
/ 08 февраля 2020

В настоящее время я храню коллекцию std::unique_ptr s для кучи выделенных объектов полиморфа c типа:

struct Foo {
  virtual ~Foo() = default;
};
Collection<std::unique_ptr<Foo>> foos;

Базовый интерфейс c, который мне нужен - это установка / получение владельцев. Foo в / из foos. Объекты, хранящиеся в foos, никогда не должны быть nullptr, поэтому я хотел бы заменить время выполнения assert(owner_taken) проверками во время компиляции. Более того, я хотел бы иметь возможность использовать ненулевые владельцы в контексте, где можно ожидать обнуляемого.

Возможно, мне нужно хранить что-то вроде unique_ref, но как мне извлечь его из foos? Мне не нужна копия, я хочу сам хранимый объект, поэтому owner->clone() не является решением. Я тоже не могу std::move(owner), потому что впоследствии состояние «уникальной ссылки» будет недействительным.

Есть ли чистое решение по проекту?

1 Ответ

0 голосов
/ 08 февраля 2020

Есть ли уникальный в своем роде уникальный владелец объектов, выделенных в куче?

В стандартной библиотеке такого типа нет.

Возможно реализовать такое тип. Просто определите тип с уникальным членом и отметьте конструктор по умолчанию как удаленный. Вы также можете пометить конструктор из std::nullptr_t как удаленный, так что построение из nullptr будет предотвращено во время компиляции.

Независимо от того, создаете ли вы внешний указатель или выделяете в конструкторе, альтернативы для проверки нет. для нуля во время выполнения.

...