Комментарии 11
В примере с «повышаемыми» типами вы заменили float на double. double же тоже «повышаемый»? Есть long double.
Не понимаю, зачем в
std::vector. Разве нельзя как-нибудь так:
printf на шаблонах и без рекурсии
std::vector. Разве нельзя как-нибудь так:
((printFmt(), std::cout << args), ..., (printFmt()));
А еще лучше и быстрее как-нибудь так:
github.com/fmtlib/fmt
github.com/fmtlib/fmt
Раскрытие пакета — это не макрос, оно не заменит
args...
на просто список через запятую. Я привел список того, как можно раскрывать пакет. В данном случае — в список инициализации. Ваш пример просто не скомпилируется.printf на вариативных шаблонах не сможет выдать compile-time ошибку несоответвия формата, т.к. шаблон (const char*) нельзя передать в constexpr функцию на проверку. Разве что хаком с _s из boost::hana, но он использует нестандартизированное расширение языка в GCC и Clang, да и компилироваться такая конструкция будет неспешно.
По-моему, «type promotion» обычно переводят как «расширение типа»; по крайней мере, такой вариант в гугле все же попадается.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
C++: сеанс спонтанной археологии и почему не стоит использовать вариативные функции в стиле C