Как стать автором
Обновить

Комментарии 9

Чем конечный вариант (очень странного) примера лучше изначального варианта?
Тем что теперь стало меньше кода, выглядит (лично для меня) более читаемым и понятным.
Один аргумент вместо двух, шаг вперёд теперь совмещён с проверкой на конец контейнера.
По поводу странности: Я ориентировался на то как сделаны перечислители в Linq.
Во-первых, кода столько же.
Во-вторых, повышенная читабельность под сомнением: все плюсовики привыкли к STL-стилю и легче прочитают изначальный вариант.
В-третьих, уменьшение числа аргументов не только понизило сложность, но и уменьшило универсальность: теперь алгоритм нельзя применить к части контейнера. С тем же успехом вы могли просто поставить единственным аргументом ссылку на вектор.
Насчёт странности: я имел в виду не ваше решение, а поставленную изначально задачу. Вы не могли бы привести какой-нибудь более-менее жизненный пример задачи, решение которой вы упростили таким образом? Возможно, станет легче понять, что вы имели в виду, и увидеть преимущества вашего решения.

А почему вас не устраивает так:


std::vector<int> values { 0, 1, 2, 3, 4, 5 };
for (auto i : values)
    std::cout << i;

Зачем


template <typename...> typename Container

если можно просто typename Container. Вам ведь по отдельности аргументы не нужны, а появляется искусственное ограничение что контейнер может быть только шаблоном.


В ещё можно просто воспользоваться range-v3.

По-моему, проще сделать конечный автомат, который будет хранить в state обработчик, который нужно применять сейчас. Тогда у вас будут обработчики, которые ничего не знают про перечисление и перечислитель, который вызывает нужную функцию.

Можно использоват Qt и любить STL. Не так уж они и пересекаются, как кажется. Контейнеры и алгоритмы в Qt всё равно имеют STL-совместимый интерфейс (хотя, вроде, это можно и "отключить"), более того, последние так уже вполне официально рекомендуют использовать из STL.

Наверное я не понял постановку задачи — простой цикл for() по контейнеру почему не подходит?
#include <iostream>
#include <vector>
#include <string>

void do_anything(std::string &);

int main () {

    std::vector<std::string> strings = {"first", "second", "third", "fourth"};

    for (auto it : strings) {
        do_anything(it);
    }
}

void do_anything(std::string &str) {
    std::cout << str << std::endl;
}

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории