стирание типов в fmt? Насколько я видел, там есть чтото вроде битовой маски для флагов, затем енумерация для встроенных и кастомных типов. Но как при этом работают кастомные типы? Имплементация vprint находится не в заголовке, но мы можем кастомизировать процесс печати спецификацией шаблона, не понимаю.
можно запомнить указатель на функцию, который принимает аутпут итератор и void* на данные
Как хитро, кажется понял
С чего ты взял что в fmt должно быт стирание типов?
Если опустить оптимизации именно fmt, примерно так: аргументы преобразуются в массив variant, которые включают основные типы, string_view и custom. До конечной функции оно добирается как span. Custom представлен как пара void* + function pointer, тут вот и стирание.
std format отказался от оптимизаций с паковкой селекторов variant, это может и к лучшему. arg-pack должен быть простым типом чтобы его удобно было транслировать. Например интерфейс логгера, если хотим минимальный binary footprint, он должен быть вроде std print, шаблонная обёртка сверху, которая уже передаёт в реальную функцию например (logLevel, fmtStr, argPack).
Обсуждают сегодня