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 Egor Suvorov

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

Корректность 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 несколько раз.

comment:2 Changed 4 years ago by Ruslan Salkaev

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

Успел пофиксить только частично. format с наследованием теперь вроде работает.

comment:3 Changed 4 years ago by Egor Suvorov

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

Корректность 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.