Как удалить данные из экземпляра класса после однократного возвращения данных - PullRequest
0 голосов
/ 30 января 2019

В моем приложении мне нужно прочитать некоторые значения из некоторого источника, сохранить их некоторое время в хранилище, а затем применить.После применения значения не нужны и могут быть удалены из хранилища.

class Storage: public Singleton<...> {
public:
    void addValue(int v) {values.push_back(v);}
    // ...
private:
    std::vector<int> values;
    // ...
}

// read values from some source and keep them in the storage
void Init() {
    for (...) {
        Storage::Instance()->addValue(...);
    }
}

// a few seconds later...

// apply values somehow and get rid of them
void Apply() {
    auto &&values = Storage::Instance()->getValues();
    // ideally, at this point Storage must not contain values array
    // process values somehow
    for auto i: values {
    // ...
    }
    // values are not needed any longer
}

Мой вопрос: как мне реализовать метод getValues?Можно ли реализовать его так, чтобы он очищал массив values в Storage после вызова (используя семантику перемещения или что-то еще)?Другими словами, нет необходимости сохранять values в Storage после того, как getValues был вызван один раз.

Если это невозможно, мне придется реализовать дополнительный метод, скажем Storage::clearValues, которыйМне нужно позвонить в конце Apply() - это то, чего я стараюсь избегать.

1 Ответ

0 голосов
/ 30 января 2019

Возврат по значению от перемещенного члена:

class Storage
{
public:
    void addValue(int v) {values.push_back(v);}
    std::vector<int> takeValues() {
        std::vector<int> res = std::move(values);
        values.clear();
        return res;
    }
private:
    std::vector<int> values;
};

С is-a-Move-from-vector-Always-empty , мы не можем просто реализовать return std::move(values);: - /

...