Как я могу хранить класс без конструктора копирования в std :: vector? - PullRequest
0 голосов
/ 24 ноября 2018

В нашем коде проекта тип ресурса не должен копироваться.

struct Res {
    ....
    Res(const Res& rhs) = delete;
    Res& operator=(const Res&) = delete;
    Res(Res&&) = delete;
    Res& operator=(Res&&) = delete;
};

Однако, похоже, для контейнера std требуется конструктор копирования.Так как же я могу сохранить Res в std :: vector?

class ResourceCache{
    ....
    const Res& GetRes(size_t index);
    std::vector<Res> resources_;
}

1 Ответ

0 голосов
/ 24 ноября 2018

Поскольку вы удалили как копирование, так и перемещение конструкторов / операторов присваивания, ответ таков: вы не можете использовать такой vector любым разумным способом.Без копирования или перемещения в качестве опции вы в лучшем случае сможете предварительно reserve пробел один раз и emplace_back в vector, но все, что может впоследствии изменить емкость, или в любомперестановка элементов была бы недопустимой (поскольку это подразумевало бы использование операций перемещения или копирования).

Как уже упоминалось в комментариях, вы можете создать vector умных указателей, где только умныеуказатель должен быть перемещен / скопирован, а не экземпляр Res, на который он указывает, и получить полностью функциональный vector.Например, с std::unique_ptr ваш класс может быть реализован как:

class ResourceCache{
    ....
    const Res& GetRes(size_t index) {
        return *resources_.at(index);  // Can still provide const references at API level
    }
    std::vector<std::unique_ptr<Res>> resources_;
}

, и вы просто используете resources_.push_back(std::make_unique<Res>(...args to Res constructor...)) для создания / вставки элементов в resources_, а не resources_.push_back(Res(...args to Res constructor...)).

...