Я начинаю использовать функции С++ 11, и мне нравится использовать интеллектуальные указатели только для собственных объектов. Вот мой класс:
class MyClass {
public:
vector<MyObject*> get_objs() const;
private:
vector<unique_ptr<MyObject>> m_objs;
};
Семантика заключается в том, что MyClass принадлежит серию MyObject, которые создаются с помощью make_unique(). get_objs() возвращает вектор исходных указателей, чтобы различные вызывающие объекты обновляли объекты. Поскольку эти вызывающие лица не владеют объектами, поэтому функция не возвращает vector<unique_ptr>.
Но это означает, что мне нужно реализовать get_objs() следующим образом:
vector<MyObjects*> MyClass::get_objs() const
{
vector<MyObjects*> ret;
for (auto obj : my_objs) {
ret.push_back(obj->get());
}
return ret;
}
Моя забота get_objs() называется довольно часто, каждый раз, когда есть накладные расходы для создания этого необработанного вектора указателя.
Я могу здесь что-то сделать? Если для сохранения накладных расходов нет С++ 11 трюков, должен ли я просто использовать тип vector<MyObject*> для m_objs в первую очередь?
UPDATE 1
Решение Джонатана Вакели, использующее operator[], улучшает мой, так что вызывающий может напрямую обращаться к отдельному объекту.
Есть ли другое решение? Я не против перебирать все места, вызывающие get_objs(),, но нравится видеть, есть ли еще лучшее решение.
Другое примечание - я не могу использовать BOOST, просто какое-то ограничение, с которым мне нужно жить.