Кажется, что я упускаю что-то очевидное, но я не могу найти элегантное решение следующей проблемы.
Мне нужно создать коллекцию объектов, некоторые из которых указаны с помощью 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, а также разыменовать, чтобы сделать его "прозрачным" для хранения обоих видов вещей, но все это выглядит сложным и неоптимальный.
Есть ли лучший способ сделать это?