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
Owner: | changed from Egor Suvorov to Igor Engel |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Поправил include. Маковская стдлиба инклюдит явно больше чем все остальные...
Мне с member detection нравится больше, так-как проверяет корректность всех методов... Хотя, возможно падать по полноценной ошибке компиляции в этом случае лучше...
Не совсем понимаю как проверять корректность, допустим того, что он не rvalue-qualified на "напрямую SFINAE", там всё равно выходит примерно полноценный member detection
Переделал на почти полный набор структур
Ну ладно :c
Я так понял, предполагалось такое
Ой... Чё-то я даже пропустил как VLA использовал. Поправил. std::numeric_limits оооочень странная вещь во всех отношениях кроме min и max...
comment:3 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:4 Changed 4 years ago by
Owner: | changed from Igor Engel to Egor Suvorov |
---|
comment:5 Changed 4 years ago by
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
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
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
Type: | ожидаются исправления → ожидается проверка |
---|
Кажется, по другому не умею создавать FormatHelper? только один раз на элемент, при том, что замена элемента только в конструкторе, и любая оценка на estimate_size без создания хэлперов кроме MAX_SIZE_T легко может быть нарушена...
Действительно...
Ок
Хэлперы наверное таки хочется, has_format_helper_v юзается в двух местах, а has_format_v для консистентности.
comment:9 Changed 4 years ago by
Owner: | changed from Egor Suvorov to Igor Engel |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Так создаётся-то FormatHelper
в конструкторе. Зачем ему быть mutable
? С чего бы ему меняться в const
методах?
Это последнее, пока что стиль 2.8/3.
comment:10 Changed 4 years ago by
Owner: | changed from Igor Engel to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
А. хм. Мне казалось я там по другому писал, но действительно... Поправил
Корректность 6/7:
#include <cassert>
или#include <assert.h>
:Стиль 2/3:
FormatHelper<T>().estimate_size()
. Подсказка: вы полностью контроллируете, что лежит внутри всех случаевFormatHelper
.has_format
, а напрямую заюзать SFINAE.has_format_v<T>
, а вспомогательную функцию делатьhas_format_test
. Иначе при использовании вылезает какой-то левыйnullptr
.FormatHelper<bool>
//Why not? xD
— https://cs9.pikabu.ru/post_img/2016/10/05/7/147566494316092723.jpg . Лучше честно 5 илиval ? 4 : 5
.FormatHelper
один раз, мне кажется.auto
.app