Иногда значение должно быть преобразовано в буквальную текстовую форму, такую какint
, представленную какstd:строка
или наоборот, когдаstd:строка
толкуется какint
. Такие примеры являются общими при преобразовании между типами данных, внутренними для программы и внешними для программы, такими как окна и файлы конфигурации.
Стандартные библиотеки C и C++ предлагают ряд возможностей для выполнения таких преобразований. Однако они различаются по своей простоте использования, расширяемости и безопасности.
Например, существует ряд ограничений с семейством стандартных функций C, типизированныхatoi
:
- Конверсия поддерживается только в одном направлении: от текста к внутреннему типу данных. Преобразование в другую сторону с использованием библиотеки C требует либо неудобства и скомпрометированной безопасности функции
sprintf
, либо потери переносимости, связанной с нестандартными функциями, такими какitoa
.
- Диапазон поддерживаемых типов представляет собой лишь подмножество встроенных числовых типов, а именно
int
,long
иdouble
.
- Диапазон типов не может быть расширен единообразно. Например, преобразование из представления струн в сложное или рациональное.
Стандартные функции C, типичные длястратола
, имеют те же основные ограничения, но обеспечивают более точный контроль над процессом преобразования. Однако для обычного случая такой контроль часто либо не требуется, либо не используется. Семейство функцийscanf
обеспечивает еще больший контроль, но также не обеспечивает безопасность и простоту использования.
Стандартная библиотека C++ предлагаетструнный поток
для обсуждаемого форматирования в ядре. Он предлагает большой контроль над форматированием и преобразованием ввода-вывода в произвольные типы и из них через текст. Однако для простых конверсий прямое использованиеструнного потока
может быть либо неуклюжим (с введением дополнительных локальных переменных и потерей удобства инфикс-выражения), либо неясным (где объектыструнного потока
создаются как временные объекты в выражении). Facets обеспечивают всеобъемлющую концепцию и возможность управления текстовым представлением, но их воспринимаемая сложность и высокий уровень ввода требуют чрезвычайной степени участия для простых конверсий и исключают всех, кроме нескольких программистов.
Шаблон функцииlexical_cast
предлагает удобную и последовательную форму для поддержки общих преобразований в произвольные типы и из них, когда они представлены в виде текста. Упрощение, которое он предлагает, заключается в удобстве для таких конверсий. Для более сложных конверсий, например, когда точность или форматирование требуют более жесткого контроля, чем предлагается поведением по умолчаниюlexical_cast
, обычныйstd::струнный
подход рекомендуется. Если преобразования числовые, тоусилите::числовой_cast
может предложить более разумное поведение, чемлексический_cast
.
Для хорошего обсуждения вариантов и вопросов, связанных с форматированием на основе струн, включая сравнениеструнного потока
,lexical_cast
и других, см. статью Херба СаттераThe String Formatters of Manor Farm. Также обратите внимание на разделПроизводительность.