Изменение
std::list<Bar> & getBars()
до
std::list<Bar> getBars()
В принципе это будет возвращаться по значению, но есть механизм исключения копирования, поэтому оптимизирующие компиляторы должны иметь возможность оптимизировать
std::list<Bar> bars (getBars());
чтобы не задействовать конструктор копирования и просто напрямую собрать bars
.
Кроме того, в C ++ 0x есть конструктор перемещения, поэтому приведенный выше код эффективен, даже если копирование / перемещение по какой-либо причине не исключено.
РЕДАКТИРОВАТЬ для пропущенного вопроса подкласса:
В целом это невозможно сделать чисто в C ++ (я предполагаю, что Foo
является суперклассом из Bar
, иначе то, что вы делаете, не имеет особого смысла). Возможно, это возможно с некоторой reinterpret_cast
черной магией, но я настоятельно рекомендую против этого.
Ближайшее приближение, вероятно, таково (с учетом getBars()
соответственно):
std::list <Bar*> bars (getBars ());
std::list <Foo*> foos (bars.begin (), bars.end ());
Однако это накладывает на вас некоторое нетривиальное бремя управления памятью. Использование некоторых указателей может помочь, но, насколько я помню, в контейнерах можно использовать только shared_ptr
.
Наконец, иерархия классов Foo
/ Bar
должна использовать виртуальные функции, в противном случае то, что вы хотите сделать, почти наверняка не сработает (т.е. если вы действительно не хотите игнорировать любые переопределения в подклассе).