Проблема с использованием строк в стиле printf
в том, что эти строки
- в зависимости от типов предоставленных аргументов и
- зависит от порядка предоставленных аргументов.
Это не только подвержен ошибкам , когда вы пишете эти строки. По моему опыту, типы и порядок аргументов легко изменятся в программном обеспечении, которое активно поддерживается и расширяется, и гораздо сложнее поддерживать синхронизацию строк формата с изменениями, примененными позже, чем при первоначальной записи код.
Проблема необходимости вручную поддерживать синхронизацию типов параметров со строкой форматирования может быть легко решена в C ++, streams доказали это 25 лет назад. Boost.Format даже удается объединить строки форматирования с типом безопасности.
Некоторые библиотеки журналов используют другой подход, решающий обе проблемы: они используют синтаксис, в котором вы указываете, какой параметр должен быть вставлен в определенное место в строке, с помощью имя параметра , и они освобождают вас от необходимости думать о типе параметра путем индивидуального преобразования всех параметров в строки перед их вставкой:
log( "i now has the value of @(i), current size is @(x.get_size(y))",
LOG_PARAM(i) + LOG_PARAM(x.get_size(y)) );