вектор c ++ со строгой семантикой владения - PullRequest
3 голосов
/ 18 августа 2011

Это , а не вопрос о помещении std :: auto_ptr в std :: vector.

Есть ли какой-нибудь векторный эквивалент std::auto_ptr в std::, std::tr1:: или boost::? Я использую std::auto_ptr в параметрах функций и возвращаемых значениях для определения семантики владения этими функциями. Но так я могу пропустить только отдельные объекты. В качестве временного решения для векторов у меня есть это:

std::auto_ptr<std::vector<std::tr1::shared_ptr<ClassExample> > > fx(....);

который, я полагаю, введя надстройку, я смогу изменить на это:

std::auto_ptr<std::vectro<boost::unique_ptr<ClassExample> > >f(...);

для определения строгой передачи права собственности, но это кажется довольно сложным. Чтобы упростить это, я могу использовать

std::vector<boost::unique_ptr<ClassExample> > f(...);

поскольку цена за глубокое копирование вектора невысока, но мне все еще любопытно, есть ли что-то, что я могу использовать так:

auto_vector<ClassExample> f(...);

означает, что функция освобождает владельцев всех объектов, а векторный массив внутренних данных не копируется глубоко.

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Существует решение C ++ 11 - оно требует реализации, которая предоставляет ссылки на r-значения, и имеет стандартную библиотеку, обновленную для включения конструкторов перемещения и std::unique_ptr.

Просто верните std::vector<std::unique_ptr<T>> - этот тип не может быть скопирован , так как std::unique_ptr<T> не копируется. При возврате компилятор будет использовать конструктор перемещения, который не вызовет глубокую копию или применит RVO и исключит создание нового объекта.

3 голосов
/ 18 августа 2011

Без какой-либо конкретной причины, по которой вам нужно поддерживать вектор указателей, первое решение состоит в том, чтобы отбросить всю сложность и перейти к простому:

std::vector<Type> f();

Владение объектами - это уникально (вектор принадлежит им), и хотя код выглядит как будто он копирует вектор при возврате, он будет оптимизирован в большинстве случаев.

Если вам нужно , чтобы объекты внутри вектора были динамически размещены из-за какого-то другого требования (объекты должны быть выделены через фабрику, они являются указателями на производные типы или не могут двигаться из-за роста вектора - код поддерживает ссылки / указатели), который вы не показываете, тогда я бы выбрал boost::ptr_vector, который будет поддерживать владение содержащимися объектами.Опять возврат по значению:

boost::ptr_vector<Type> f();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...