Можно ли хранить shared_ptr и weak_ptr в одном контейнере? - PullRequest
0 голосов
/ 09 февраля 2020

Кажется, что я упускаю что-то очевидное, но я не могу найти элегантное решение следующей проблемы.

Мне нужно создать коллекцию объектов, некоторые из которых указаны с помощью shared_ptr (и, таким образом, принадлежит самому контейнеру), а некоторые - слабому_приобретателю (таким образом, не принадлежит).

Как лучше всего это сделать? До сих пор я придумал довольно уродливое решение, подобное этому:

template <class Data>
struct holder {
  shared_ptr<Data> owned;
  weak_ptr<Data> borrowed;

  shared_ptr<Data> get(){
    if(owned) 
       return owned;
    else
       return borrowed.lock();
  }
}
...
vector<holder<MyData>> vec;

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

Есть ли лучший способ сделать это?

...