Opened 3 years ago
Closed 3 years ago
#744 closed ожидается проверка (задача сдана)
WW_linq Klimov lab_14
Reported by: | klimov.ivan | Owned by: | Антон Филатов |
---|---|---|---|
Component: | WW_linq | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (5)
comment:1 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Почти всё работает. Но иногда происходит копирование функции в until, where и select. Пример теста вот такой
template<typename F> auto force_move(F &&f) { return NonCopyableFunctorWrapper<F>(std::move(f)); } // NonCopyableFunctorWrapper - это класс-обёртка над указателем на функцию с правильно определённым оператором() и говорящим конструктором копирования auto xs = std::vector<int>{9, 4, 8, 1, -3, 8, 7}; auto res = from(xs.begin(), xs.end()).until(force_move([](int x) { return x < 0; })).to_vector(); assert((std::vector<int>{9, 4, 8, 1}) == res);
7/10
comment:4 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
Note: See
TracTickets for help on using
tickets.
не компилируется кастомный main
В сущности minimal_smoke_test тоже не компилируется с ошибкой вот тут: cache = func_(*parent_);
Фиксить это надо так: проблема действительно в том, что вы непонятной функции передаёте parent, и компилятор думает, что эта функция нашего доблестного parent-а сломает. А не должна, ибо operator* у нас константный. Выход - вызывать функцию не во время оператора*, а заранее - в конструкторе и в операторе++ - они не константные. И это логично. Оператор* должен разыменовывать уже то, на что в данный момент enumerator показывает. А вот во время ++ надо перейти не на 1 эдемент, а ровно на столько, на сколько требует функция.
Это же касается и where. Почему-то ваш ++ делает ровно +1. until тоже работал бы правильно, если бы вы вместо if поставили бы while. Кстати говоря, в конструкторе в этих классах тоже надо вызывать переданную функцию. Вдруг оператор* сразу после создания вызовут, а первый элемент не подходит под параметры заданной функции
В остальном выглядит всё достойно, но поставить баллы пока не могу