2016-02-16 2 views
3

У меня есть этот вектор:Преобразовать вектор указатель на вектор объектов

std::vector<T*> foo; 

У меня есть функция со следующей подписью (я не могу изменить его):

void bar(std::vector<T> const&); 

Как я могу передать foo для этой функции с минимальными изменениями?

Мой текущий подход:

std::vector<T> another_bar(bar.size()); 
std::transform(std::begin(bar),std::end(bar),std::begin(another_bar),[](T* item){return *T;}); 

Я думаю, что есть много ненужного копирования происходит здесь.

РЕДАКТИРОВАТЬ:

Т не является шаблонным параметром. Это определенный тип.

+0

Что такое 'T'? Определенный тип или параметр шаблона? – Zulan

+2

Есть копирование, но я не думаю, что это не нужно. Как еще вы могли бы получить «вектор '? – alcedine

+0

Почему у вас есть вектор сырых указателей в первом кружеве? – LogicStuff

ответ

3

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

std::vector<T> another_bar; 
another_bar.reserve(bar.size()); 
std::transform(std::begin(bar), std::end(bar), 
       std::back_inserter(another_bar),[](T* item){return *T;}); 
+0

Да, это лучше. Однако я думал о совершенно лучшем решении, но, похоже, этого не существует. еще раз спасибо –

3

Ваш отзыв может быть как можно большим. Вы должны много копировать. Другая проблема заключается в том, что он также будет «срезать», если у вас есть классы, полученные из T. Иногда у вас есть две разные программы, и это неизбежно, но, скорее всего, вы должны переоценить дизайн вызывающего или функции.

+0

Уведомление о разрезании отлично! Но опять же, если 'T' был полиморфным базовым классом, подпись' foo' не имела бы никакого смысла. – Zulan

+0

foo отлично подходит для базового класса. Это вызов функции bar, который предотвращает полиморфизм. –

+0

Да, конечно .. Я сбивал с толку 'foo' и' bar'. – Zulan

2

С T является конкретным заданным типом, нет способа избежать копирования без изменения T или bar.

Если вы можете сделать T родовыми, вы можете создать свой род «Pimpl-обертку»: объект, который внутри содержит указатель на реальный T и реализует тот же интерфейс T путем вызова соответствующих функций внутри.

Другими словами, ваш код преобразования выглядит хорошо.

Смежные вопросы