Существует очень фундаментальное различие между тем, как fmt работает по сравнению с printf. А именно, строки форматирования fmt не содержат информации о типе.
fmt
основан на шаблонах c Variadi C ++. Ожидается, что информация о типе будет передаваться, как это типично для C ++: через механизмы времени компиляции . Таким образом, строки формата fmt
не должны повторять информацию о типе, которую по сути содержат все функции форматирования. Эта строгая типизация позволяет fmt
разрешать функции расширяемости на основе типов.
C переменные стирают всю информацию о типах. Без информации о типе, хранящейся в строке, невозможно восстановить информацию о типе, которой fmt
требуется для выполнения своей работы.
Библиотека libfmt содержит тип dynamic_format_arg_store
(это не является частью C ++ 20, но я думаю, что вы сможете его создать). Однако даже это требует, чтобы вы знали тип в точке, где вы сохраняете аргументы. Поскольку C вариационные числа уже стерли тип, вам не повезло.
Фундаментальные предположения о fmt
как библиотеке делают его несовместимым с C вариативным числом.