Comments
В примере с «повышаемыми» типами вы заменили float на double. double же тоже «повышаемый»? Есть long double.
Нет, все целочисленное ниже int повышается до int (со знаком или без), float — до double. [С++17 7.5 и 7.6]
Не понимаю, зачем в
printf на шаблонах и без рекурсии

std::vector. Разве нельзя как-нибудь так:
((printFmt(), std::cout << args), ..., (printFmt()));
Раскрытие пакета — это не макрос, оно не заменит args... на просто список через запятую. Я привел список того, как можно раскрывать пакет. В данном случае — в список инициализации. Ваш пример просто не скомпилируется.
Хм, проверю вечером. Тот g++, что у меня есть сейчас отказывается это компилировать.
Да, действительно так можно, это получается свертка. А я, когда пытался избавиться от вектора, раскрывал пакет в список инициализации и получал ошибку компиляции. Спасибо большое! Я обновлю функцию в статье.

printf на вариативных шаблонах не сможет выдать compile-time ошибку несоответвия формата, т.к. шаблон (const char*) нельзя передать в constexpr функцию на проверку. Разве что хаком с _s из boost::hana, но он использует нестандартизированное расширение языка в GCC и Clang, да и компилироваться такая конструкция будет неспешно.

зато const char(&str)[strLen] или std::string_view может быть разобранным compile-time.
По-моему, «type promotion» обычно переводят как «расширение типа»; по крайней мере, такой вариант в гугле все же попадается.
Only those users with full accounts are able to leave comments. Log in, please.