Я начинаю использовать функции С++ 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, просто какое-то ограничение, с которым мне нужно жить.