cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавляем недостающие type-erased перегрузки `std::format` и `std::print` #585

Closed HolyBlackCat closed 6 months ago

HolyBlackCat commented 7 months ago

Допустим, хочется напечатать через std::print не напрямую в stdout/stderr/FILE *, а в type-erased колбек.

Пример печати в колбек ```сpp #include #include #include #include struct Printer { using callback_t = std::function; callback_t callback; template void print(std::format_string fmt, Args &&...args) { callback(fmt.get(), std::make_format_args(args...)); } Printer(callback_t callback) : callback(std::move(callback)) {} Printer(FILE *file) : Printer([file](std::string_view fmt, std::format_args args) { std::vprint_unicode(file, fmt, args); }) {} }; int main() { Printer p(stdout); p.print("Hello, {}!", "World"); } ```

В теории это должно быть просто, по аналогии с std::vprintf, но на практике вылезает сырость API:

Как это чинить?