Почему преобразование целых чисел в строки до сих пор не было явно включено в C ++?

Одной из первых проблем, с которыми я столкнулся при изучении C ++, было то, что itoa Функция поддерживалась на некоторых компиляторах, но фактически не была определена в стандарте ANSI-C (и поэтому обычно считалась плохой практикой для использования).

Я видел несколько решений, таких как использование stringstream или же snprintf, который всегда чувствовал себя очень окольным, и, наконец, в C ++ 11 есть std::to_string который чувствует себя намного чище с языковой точки зрения.

Но почему понадобилось так много времени, чтобы добавить более прямой метод? У меня были проблемы с поиском чего-либо, кроме некоторых дискуссий об эффективности и отсутствия желания изменить стандарт без уважительной причины. Было ли что-нибудь официально заявлено о том, почему это не было включено или почему они наконец решили добавить это в C ++ 11? Были ли какие-либо дискуссии о добавлении этого в будущую версию C?

5

Решение

Оглядываясь назад, это был недосмотр. Однако, не зная подробностей об истории разработки C ++, рискну предположить, что у этого упущения есть веские причины, коренящиеся в теории. Видите, преобразование из числа в строку и наоборот далеко не тривиально, и оно не очень хорошо соответствует обычному определению «приведения» (на самом деле это требует анализатора / форматера), хотя большинство других языков делать предоставить такой актерский состав.

К этому следует добавить тот факт, что поддержка строковых типов в C ++ довольно… пешеходная. У C даже нет реального, выделенного для него типа, он использует char вместо массивов. С ++ идет немного далее, но останавливается далеко от надлежащей встроенной поддержки строк. Это можно увидеть во многих аспектах, из того факта, что строковый литерал по-прежнему завершается нулем char массив, к широкому согласию, что std::string имеет раздутый, плохо разработанный интерфейс. И не забывайте, что std::string даже не представляет строку! Он представляет собой массив байтов! Это важное различие, и причина этого в том, что std::string полностью кодирует агностик.

Ах, но на самом деле C ++ делает поддерживать правильное кодирование, а также правильный анализ и форматирование. Он просто не предоставляет его для строк — он предоставляет его для потоки.

И там у нас это есть. C ++ не имеет правильного строкового типа. Вместо этого он имеет потоки ввода / вывода.

5

Другие решения

Насколько я знаю, это только вопрос того, сколько способов вы хотите, чтобы преобразовать целое число в основание 10 цифр. C ++ унаследовал один от C (sprintf) и добавил один из своих operator<<(ostream &, int), Оба из них являются более настраиваемыми, чем новый to_string, так что я подозреваю, что во время C ++ 98/03 этого просто не было, потому что они были неадекватны.

Между 2003 и 2011 годами не было никаких формальных изменений в стандарте C ++ (некоторые общепризнанные опечатки и все тут), поэтому другая часть того, почему это заняло столько времени, это то, что C ++ 0x занял так много времени, и это было по причинам, которые не имеет ничего общего с to_string особенно. boost::lexical_cast заполнить этот пробел в некоторой степени.

2

По вопросам рекламы [email protected]