Opened 4 years ago
Closed 4 years ago
#1052 closed ожидается проверка (задача сдана)
WW #18
Reported by: | Ruslan Salkaev | Owned by: | Egor Suvorov |
---|---|---|---|
Component: | WW_format | Version: | |
Keywords: | Cc: |
Description
Change History (3)
comment:1 Changed 4 years ago by
Owner: | changed from Egor Suvorov to Ruslan Salkaev |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Owner: | changed from Ruslan Salkaev to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Успел пофиксить только частично. format с наследованием теперь вроде работает.
comment:3 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Корректность 5/7, всё ещё актуальны замечания, кроме определения базового класса.
Бонус 1.5/0 за реализацию чёткого member detection с сигнатурой, который работает даже для базовых классов. И позволяет проверять сигнатуру в точности. Не знал, что это возможно.
Стиль 1/3:
- Актуальны почти все предыдущие замечания. Исправлено только
5 - value_
MAX_FORMAT_FUNCTION_OUTPUT_SIZE
— всё ещё неверно, 10 — это лишь оценка (estimate) на вывод. Но это не граница сверху. Более точно:FORMAT_METHOD_RESULT_DEFAULT_ESTIMATED_SIZE
илиFormatHelper<T>::DEFAULT_ESTIMATE
(эта константа тесно связана с конкретной специализацией).typename T::value_type
уже не нужен, потому что естьT
.
- Специализацию для
bool
лучше записать какFormatHelper<bool> {
- Rule of thumb: не надо использовать вещественные функции в программах, где нужны целые числа. Проблемы с корректностью возникают в их районе.
has_format_function
-->has_format_function_v
- SFINAE member detection:
yes
/no
лучше просто заменить наtrue_type
/false_type
- А ещё лучше (начиная с C++11) —
constexpr bool
и возвращать обычныйtrue
/false
- После этого я бы заменил
HasFormatImpl<T>
наnamespace impl
(там всё равно ни одна из функций отT
не зависит) и встроилvalue
вhas_format_function
Note: See
TracTickets for help on using
tickets.
Корректность 4/7:
bad_alloc
. Поясните в ответе, пожалуйста, почему так происходит.FormatHelper
, особенно вектора.format
определён в базовом классе, а не в самом классе. Это происходит потому что вы пытаетесь взять&U::format
, аU::format
не существует, есть толькоBaseU::format
. Я не уверен, что это вообще можно сделать без C++11 с имеющимся у вас кодом.Formathelper
для целочисленных выделяется память вbuff
лишний раз.Стиль 1/3:
MAX_FORMAT_OUTPUT_SIZE
— неверная константа просто по названию. Размер выведенного вектора точно ничем не ограничен.noexcept
/final
.isFormattableVector
/isFormattable
— это на самом деле ещё раз записанные специализацииFormatHelper
. Лучше смотреть напрямую вFormatHelper
.5 - value_
— лучше тернарный оператор илиif
. Лучше дажеif
для симметрии сappend_to
.!is_same<bool>
, специализация для<bool>
более специфична. Но можно и оставить.to_chars
стоит разобрать на куски при помощи structured binding.formatted
не нужна.FormatHelper
для векторовFormatHelper<vector<T>>
, исчезнет потребность вdecltype(value_)::value_type
(кстати,decltype()
лучше заменить наT
).FormatHelper
несколько раз.