В теории это должно быть просто, по аналогии с std::vprintf, но на практике вылезает сырость API:
При переходе с std::print на std::vprint, я должен руками выбирать между std::vprint_unicode и std::vprint_nonunicode.
И наоборот, если мне не нужно type erasure, я не могу принудительно выбрать unicode или его отсутствие, нет std::print_[non]unicode.
Нет std::vprintln. Вроде мелочь, но как удобно дописать \n непонятно. Либо копировать строку формата в std::string чтобы дописать \n, либо дергать std::fputc('\n', file) - и то и то странно.
В качестве бонуса, нет std::vformat_to_n, есть только std::vformat_to. Хотя std::format_to_n есть.
Как это чинить?
Добавить std::vformat_to_n - тут все просто.
Про std::vprint я не совсем уверен. Можно просто добавить std::vprint и std::print_[non]unicode, а с отсутствием vprintln ничего не делать, потому что в libfmt он все равно реализован через временный буфер.
Допустим, хочется напечатать через
std::print
не напрямую в stdout/stderr/FILE *
, а в type-erased колбек.Пример печати в колбек
```сpp #includeВ теории это должно быть просто, по аналогии с
std::vprintf
, но на практике вылезает сырость API:При переходе с
std::print
наstd::vprint
, я должен руками выбирать междуstd::vprint_unicode
иstd::vprint_nonunicode
.И наоборот, если мне не нужно type erasure, я не могу принудительно выбрать unicode или его отсутствие, нет
std::print_[non]unicode
.Нет
std::vprintln
. Вроде мелочь, но как удобно дописать\n
непонятно. Либо копировать строку формата вstd::string
чтобы дописать\n
, либо дергатьstd::fputc('\n', file)
- и то и то странно.В качестве бонуса, нет
std::vformat_to_n
, есть толькоstd::vformat_to
. Хотяstd::format_to_n
есть.Как это чинить?
Добавить
std::vformat_to_n
- тут все просто.Про
std::vprint
я не совсем уверен. Можно просто добавитьstd::vprint
иstd::print_[non]unicode
, а с отсутствиемvprintln
ничего не делать, потому что в libfmt он все равно реализован через временный буфер.