После изменения кода для использования уникальных указателей я наткнулся на то, как вернуть коллекцию объектов клиенту. В общем, я хочу передать объекты в качестве ссылок или указатели без прав. Но если у меня есть набор объектов, я не могу просто вернуть ссылку на него.
В качестве примера у меня есть простой класс с коллекцией объектов, которые все создаются один раз и не изменяются впоследствии.
using ObjectUPtr = std::unique_ptr<Object>;
class MyClass
{
public:
const std::vector<Object*>& GetObjectsOldStyle() const
{
return mObjectsOldStyle;
}
const std::vector<VObjectUPtr>& GetObjectsNewStyleA() const
{
// I don't like that: The client should not see the unique_ptr ...
return mObjectsNewStyle;
}
std::vector<VObject*> GetObjectsNewStyleB() const
{
// Ok, but performance drops
std::transform(...); // Transform the collection and return a copy
}
const std::vector<VObject*>& GetObjectsNewStyleC() const
{
// Ok, only copied once, but two variables per collection needed
// Transform the collection and cache in a second vector<Object*>
std::transform(...);
}
std::vector<Object*> mObjectsOldStyle; // old-style owning pointers here
std::vector<ObjectUPtr> mObjectsNewStyle; // how I want to do it today
}
Сегодня я обычно предпочитаю GetObjectsNewStyleB, но мне интересно, если есть более элегантный и эффективный способ или общая передовая практика о том, как вернуть такие коллекции.