Opened 4 years ago

Closed 4 years ago

#1043 closed ожидается проверка (задача сдана)

WW#18

Reported by: Igor Engel Owned by: Egor Suvorov
Component: WW_format Version: 1.0
Keywords: Cc:

Description


Change History (11)

comment:1 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Igor Engel
Type: ожидается проверкаожидаются исправления

Корректность 6/7:

  • Не компилируется из-за отсутствия #include <cassert> или #include <assert.h>:
       In file included from tests/01_smoke_test.cpp:1:
    ../../../cpp19/engel.igor/lab_18/include/format.hpp:119:13: error: use of undeclared identifier 'assert'
                assert(ec == std::errc());
                ^
    ../../../cpp19/engel.igor/lab_18/include/format.hpp:152:16: note: in instantiation of member function 'format::FormatHelper<int, void>::append_to' requested here
            helper.append_to(formatted);
                   ^
    tests/01_smoke_test.cpp:44:19: note: in instantiation of function template specialization 'format::make_string<int>' requested here
        CHECK(format::make_string(0) == "0");
                      ^
    /usr/include/doctest.h:2471:15: note: expanded from macro 'CHECK'
    #define CHECK DOCTEST_CHECK
                  ^
    In file included from tests/01_smoke_test.cpp:1:
    ../../../cpp19/engel.igor/lab_18/include/format.hpp:119:13: error: use of undeclared identifier 'assert'
                assert(ec == std::errc());
                ^
    ../../../cpp19/engel.igor/lab_18/include/format.hpp:152:16: note: in instantiation of member function 'format::FormatHelper<unsigned int, void>::append_to' requested here
            helper.append_to(formatted);
                   ^
    tests/01_smoke_test.cpp:50:19: note: in instantiation of function template specialization 'format::make_string<unsigned int>' requested here
        CHECK(format::make_string(0u) == "0");
                      ^
    /usr/include/doctest.h:2471:15: note: expanded from macro 'CHECK'
    #define CHECK DOCTEST_CHECK
                  ^
    2 errors generated.
    make: *** [bin/01_smoke_test] Error 1
    01_smoke_test: failed compilation.
    

Стиль 2/3:

  • Можно обойтись без member detection для FormatHelper<T>().estimate_size(). Подсказка: вы полностью контроллируете, что лежит внутри всех случаев FormatHelper.
    • Ну или хотя бы вспомогательный псевдоним сделайте.
  • Можно не делать отдельный has_format, а напрямую заюзать SFINAE.
  • Если уж делать member detection, то лучше доходить до конца и создавать шаблонную параменную has_format_v<T>, а вспомогательную функцию делать has_format_test. Иначе при использовании вылезает какой-то левый nullptr.
  • FormatHelper<bool>
  • Для вектора лучше создавать FormatHelper один раз, мне кажется.
  • Для целочисленных
    • Не используйте VLA — это расширение GCC. Создайте массив фиксированного размера.
    • Пробел после auto.
    • Не нужна промежуточная переменная app

comment:2 Changed 4 years ago by Igor Engel

Поправил include. Маковская стдлиба инклюдит явно больше чем все остальные...

Мне с member detection нравится больше, так-как проверяет корректность всех методов... Хотя, возможно падать по полноценной ошибке компиляции в этом случае лучше...

Не совсем понимаю как проверять корректность, допустим того, что он не rvalue-qualified на "напрямую SFINAE", там всё равно выходит примерно полноценный member detection

Переделал на почти полный набор структур

Ну ладно :c

Я так понял, предполагалось такое

Ой... Чё-то я даже пропустил как VLA использовал. Поправил. std::numeric_limits оооочень странная вещь во всех отношениях кроме min и max...

comment:3 Changed 4 years ago by Igor Engel

Type: ожидаются исправленияожидается проверка

comment:4 Changed 4 years ago by Igor Engel

Owner: changed from Igor Engel to Egor Suvorov

comment:5 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Igor Engel
Type: ожидается проверкаожидаются исправления
  • Всё ещё не компилируется. Причины те же.
  • Сейчас member detection лучше сделать не через структуры, а через функции — станет сразу на порядки меньше кода.
  • digits10 — это int. Посмотрите ещё раз определение на cppreference (общее для всех) и в стандарте на eel.is/c++draft. log10 не нужен. А вот комментарий "что там за 2 + " нужен.
  • Пробел между auto и [ в structured binding.
  • Не нужна промежуточная переменная app.
  • cachedSize не используется.

В сумме баллов больше не стало точно :(

Мне с member detection нравится больше, так-как проверяет корректность всех методов... Хотя, возможно падать по полноценной ошибке компиляции в этом случае лучше...

Тут гораздо, гораздо лучше падать по ошибке компиляции. Иначе можно добавить новую специализацию, а потом долго и мучительно разбираться, почему же она не подцепляется.

Есть ещё подход от Кирилла: вообще не инстанцировать FormatHelper по умолчанию и проверять, что FormatHelper<T> — complete type (например, есть sizeof).

Не совсем понимаю как проверять корректность, допустим того, что он не rvalue-qualified на "напрямую SFINAE", там всё равно выходит примерно полноценный member detection

Member detection — это про перевод "корректное ли выражение" в true/false. enable_if — это в обратную сторону. Если применяется enable_if на member detection, то можно сократить ненужные члены.

comment:6 Changed 4 years ago by Igor Engel

Owner: changed from Igor Engel to Egor Suvorov
Type: ожидаются исправленияожидается проверка

Блин. У digits10 оказалось очень странное описание... Там, просто написано что для char оно 2.41, а что оно всё-таки округляется в int не написано, а тип я как-то умудрился проглядеть. Мда.

Clion почему-то решил что не нужен, и даже кажется не даёт в настройках его включить... Поставил руками...

Упс. Казалось убрал.

Убрал.

О, я думал менять реализацию по умолчанию вообще нельзя. Так удобнее.

Ну, кажется, когда надо проверить возвращаемый тип с точностью до is_same, без enable_if никак...

comment:7 Changed 4 years ago by Egor Suvorov

Type: ожидается проверкаожидаются исправления

Да, про is_same аргумент.

Корректность 7/7.

Стиль 2.5/3:

  • Неясно, зачем mutable fmt.
  • Вместо buf, buf + BUF_SIZE лучше std::begin/std::end, чтобы не надо было синхронизировать размер массива в двух строчках.
  • DEFAULT_BOUND --> DEFAULT_SIZE для симметрии с estimate_size.
  • Опционально: если не хотеть вводить реальные хелперы has_format_v/has_format_helper_v, то можно полностью стереть namespace validator и проверять соответствующие условия прямо в специализациях. Например, sizeof(FormatHelpr<T>) — это просто напрямую применяется SFINAE. Ну, потребуется какой-нибудь трюк с void_t/decltype или чем-то таким сделать.

comment:8 Changed 4 years ago by Igor Engel

Type: ожидаются исправленияожидается проверка

Кажется, по другому не умею создавать FormatHelper? только один раз на элемент, при том, что замена элемента только в конструкторе, и любая оценка на estimate_size без создания хэлперов кроме MAX_SIZE_T легко может быть нарушена...

Действительно...

Ок

Хэлперы наверное таки хочется, has_format_helper_v юзается в двух местах, а has_format_v для консистентности.

comment:9 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Igor Engel
Type: ожидается проверкаожидаются исправления

Так создаётся-то FormatHelper в конструкторе. Зачем ему быть mutable? С чего бы ему меняться в const методах?

Это последнее, пока что стиль 2.8/3.

comment:10 Changed 4 years ago by Igor Engel

Owner: changed from Igor Engel to Egor Suvorov
Type: ожидаются исправленияожидается проверка

А. хм. Мне казалось я там по другому писал, но действительно... Поправил

comment:11 Changed 4 years ago by Egor Suvorov

Resolution: задача сдана
Status: assignedclosed

Ура!

Note: See TracTickets for help on using tickets.