Использование std::transform
std::vector<T*> vec2;
vec2.reserve(vec1.size()); // optimization to avoid reallocations, it isn't necessary, and without it the code still works correctly
std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2), [](const std::unique_ptr<T>& p){ return YourCloneFunction(*p); }
Один из способов, чтобы написать клон функции, чтобы сделать все ваши классы-потомки определили виртуальную clone
функцию, который является абстрактным в T
. Код такого метода прост, но его необходимо определить для каждого класса Derived
.
class T
{
virtual std::unique_ptr<T> clone() const = 0;
virtual ~T(){}
};
class Derived : public T
{
std::unique_ptr<T> clone() const override {
return std::unique_ptr<T>(new Derived(*this));
}
};
При этом, код становится
std::vector<T*> vec2;
vec2.reserve(vec1.size()); // optimization to avoid reallocations, it isn't necessary, and without it the code still works correctly
std::transform(vec1.begin(), vec1.end(), std::back_inserter(vec2), [](const std::unique_ptr<T>& p){ return p->clone().release(); }
Обратите внимание, что у нас есть vec2
сырые указатели, указывающие на объекты, не принадлежащие какой-либо смарт-указатель. Это плохо, если вы не пропустите vec2
в функцию устаревания, которая берет на себя ответственность за эти указатели.
В противном случае, если вы хотите только std::vector<T*>
вид копии, клонировать в промежуточном std::vector<std::unique_ptr<T>>
, а затем скопировать результат .get()
на каждом экземпляре для std::vector<T*>
Что именно проблема? Вы не знаете, как получить базовый указатель от 'unique_ptr'? Или что-то другое? – SergeyA
@SergeyA. Я знаю, что горячий, чтобы получить необработанный указатель из 'std :: unique_ptr' (метод' get() '). Но если я нажму на vec2, то vec2 не будет независим от vec1. Указатели из vec1 указывают на то же место в памяти, что и указатели от vec2. Мне нужна копия объектов. – peter55555
Зачем? Это огромный запах кода. C API принимает 'T **' и право собственности? :( –