C ++ итератор для инициализации коллекций объектов без конструктора по умолчанию - PullRequest
0 голосов
/ 09 марта 2020

У меня есть класс Foo без разумного конструктора по умолчанию. Я также предпочел бы сохранить конфиденциальность оператора копирования, хотя это может стать невозможным. (Я хотел бы сделать класс «почти» неизменяемым, поэтому потокобезопасным, имея поля const и небольшое количество мутаторов, которые приводят const way как private и в начале срока жизни объекта.)

Создание std::vector<Foo> с этими ограничениями - небольшая проблема. Я нашел решение, которого не видел нигде (см., Например, предыдущий вопрос SO 1 ). У меня есть собственный итератор, который при разыменовании создает Foo. Он настроен так, что каждый вызов увеличивается до следующего значения Foo в векторе. Последовательность легко определить. Я определяю operator++, next, advance, distance и operator* на CustomIterator.

Тогда у меня

std::vector<Foo> foo_vec{CustomIterator(0), CustomIterator(size_of_vector)};

Нет проблем с доступом. Нет ненужных конструкций. Нет копий. Кто-нибудь видит проблему с этим?

1 Ответ

0 голосов
/ 09 марта 2020

Я буду обобщать комментарии. Простая фабрика генерирует вектор инициализированных элементов.

#include <vector>
class X {
    explicit X(int value) : value_(value) {}
    X& operator=(const X&) = default;
    friend std::vector<X> generate(int from, int to);
  public:
    const int value_;
};
// simplest factory ever
std::vector<X> generate(int from, int to) {
    std::vector<X> result;
    result.reserve(to - from);
    for (int k = from; k < to; ++k) {
        result.emplace_back(std::move(X(k)));
    }
    return std::vector<X>();
}
int main() {
    auto v = generate(0, 10);
    static_cast<void>(v);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...