приведите std :: vector <std :: shared_ptr <T>> к std :: vector <std :: shared_ptr <const T >> - PullRequest
2 голосов
/ 04 июня 2019

У меня есть три ученика:

public:
    std::vector<std::shared_ptr<Object> > getObjects();
    std::vector<std::shared_ptr<const Object> > getObjects() const;

private:
    std::vector<std::shared_ptr<Object> > m_objects;

Я получаю ошибку компилятора, когда возвращаю m_objects в const версии getObjects(), потому что m_objects не соответствуетвозвращаемый тип (std::vector<std::shared_ptr<const Object>>).

В моем временном решении сначала я воссоздаю вектор объекта локально, повторяя, а затем возвращаю локальный вектор, но есть ли более оптимизированный способ обработки этого сценария?

std::vector<std::shared_ptr<const Object> > objects;
for (auto & object: m_objects)
{
    objects.push_back(object);
}
return objects;

1 Ответ

1 голос
/ 05 июня 2019

Вы не можете разыграть от std::vector<std::shared_ptr<T>> до std::vector<std::shared_ptr<const T>>, даже reinterpret_cast приведет к неопределенному поведению. Для деталей, связанный вопрос cast vector<T> to vector<const T> может помочь.

Создание копии - лучшее, что вы можете сделать. Но, как указал Фрэнк, это можно записать более кратко, как return {m_objects.begin(), m_objects.end()}. Это также позволяет избежать некоторых ненужных выделений, так как размер конечного контейнера сразу известен (в отличие от подхода push_back).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...