Одной из первых проблем, с которыми я столкнулся при изучении C ++, было то, что itoa
Функция поддерживалась на некоторых компиляторах, но фактически не была определена в стандарте ANSI-C (и поэтому обычно считалась плохой практикой для использования).
Я видел несколько решений, таких как использование stringstream
или же snprintf
, который всегда чувствовал себя очень окольным, и, наконец, в C ++ 11 есть std::to_string
который чувствует себя намного чище с языковой точки зрения.
Но почему понадобилось так много времени, чтобы добавить более прямой метод? У меня были проблемы с поиском чего-либо, кроме некоторых дискуссий об эффективности и отсутствия желания изменить стандарт без уважительной причины. Было ли что-нибудь официально заявлено о том, почему это не было включено или почему они наконец решили добавить это в C ++ 11? Были ли какие-либо дискуссии о добавлении этого в будущую версию C?
Оглядываясь назад, это был недосмотр. Однако, не зная подробностей об истории разработки C ++, рискну предположить, что у этого упущения есть веские причины, коренящиеся в теории. Видите, преобразование из числа в строку и наоборот далеко не тривиально, и оно не очень хорошо соответствует обычному определению «приведения» (на самом деле это требует анализатора / форматера), хотя большинство других языков делать предоставить такой актерский состав.
К этому следует добавить тот факт, что поддержка строковых типов в C ++ довольно… пешеходная. У C даже нет реального, выделенного для него типа, он использует char
вместо массивов. С ++ идет немного далее, но останавливается далеко от надлежащей встроенной поддержки строк. Это можно увидеть во многих аспектах, из того факта, что строковый литерал по-прежнему завершается нулем char
массив, к широкому согласию, что std::string
имеет раздутый, плохо разработанный интерфейс. И не забывайте, что std::string
даже не представляет строку! Он представляет собой массив байтов! Это важное различие, и причина этого в том, что std::string
полностью кодирует агностик.
Ах, но на самом деле C ++ делает поддерживать правильное кодирование, а также правильный анализ и форматирование. Он просто не предоставляет его для строк — он предоставляет его для потоки.
И там у нас это есть. C ++ не имеет правильного строкового типа. Вместо этого он имеет потоки ввода / вывода.
Насколько я знаю, это только вопрос того, сколько способов вы хотите, чтобы преобразовать целое число в основание 10 цифр. C ++ унаследовал один от C (sprintf
) и добавил один из своих operator<<(ostream &, int)
, Оба из них являются более настраиваемыми, чем новый to_string
, так что я подозреваю, что во время C ++ 98/03 этого просто не было, потому что они были неадекватны.
Между 2003 и 2011 годами не было никаких формальных изменений в стандарте C ++ (некоторые общепризнанные опечатки и все тут), поэтому другая часть того, почему это заняло столько времени, это то, что C ++ 0x занял так много времени, и это было по причинам, которые не имеет ничего общего с to_string
особенно. boost::lexical_cast
заполнить этот пробел в некоторой степени.