У меня есть класс Foo с переменной-членом типа std::vector<std::unique_ptr<Bar>>
, который я бы хотел заполнить в списке инициализации конструктора этого класса. Это возможно?Можно ли создать std :: vector <std :: unique_ptr <Bar>> с помощью конструктора заливки?
Я надеялся, что с помощью заливки конструктор вектора будет возможно, что-то вроде этого
Foo::Foo(int n):
vector<unique_ptr<Bar>> (n, unique_ptr<Bar> (new Bar))
{}
, но я думаю, что это требует копирования конструктор std::unique_ptr
, который удален (как это должно быть) (unique_ptr(const unique_ptr&) = delete
) ,
Есть ли лучший способ сделать это?
Вы правы в что ваша попытка не будет работать, потому что вы вызываете только «новый бар» один раз, тогда как для вектора уникальных указателей вам нужно называть «новый бар» один раз для каждого элемента. Я думаю, вам лучше всего использовать цикл с 'emplace_back'. –
В качестве альтернативы вы можете заполнить конструкцию пустым 'unique_ptr', а затем цикл через вызов' reset (new Bar) 'на каждом из них. –
Пока C++ не получит повторяющиеся сопрограммы, я думаю, что ваш лучший выбор - это цикл. – zneak