Почему нет std:: stou?
В С++ 11 были добавлены некоторые новые функции преобразования строк:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Он включает в себя stoi (string to int), stol (string to long), stoll (длинный длинный), stoul (string to unsigned long), stoull (строка до unsigned long long). Примечательным в его отсутствие является функция stou (string to unsigned). Есть ли какая-то причина, по которой это не нужно, но все остальные?
related: Нет функции "sto {short, unsigned short}" в С++ 11?
Ответы
Ответ 1
Самый дорогой ответ будет заключаться в том, что библиотека C не имеет соответствующего "strtou
", а строковые функции С++ 11 - это всего лишь тонко завуалированные обертки вокруг функций библиотеки C: std::sto*
function mirror strto*
, а функции std::to_string
используют sprintf
.
Изменить: Как указывает KennyTM, оба stoi
и stol
используют strtol
как базовую функцию преобразования, но все же остается загадочным, почему, когда существует stoul
, который использует strtoul
, нет соответствующих stou
.
Ответ 2
Я не знаю, почему stoi
существует, но не stou
, но единственная разница между stoul
и гипотетическим stou
будет проверкой того, что результат находится в диапазоне unsigned
:
unsigned stou(std::string const & str, size_t * idx = 0, int base = 10) {
unsigned long result = std::stoul(str, idx, base);
if (result > std::numeric_limits<unsigned>::max()) {
throw std::out_of_range("stou");
}
return result;
}
(Аналогично, stoi
также похож на stol
, просто с другой проверкой диапазона, но поскольку он уже существует, нет необходимости беспокоиться о том, как его реализовать.)