Подтвердить что ты не робот

Почему нет 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?

4b9b3361

Ответ 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, просто с другой проверкой диапазона, но поскольку он уже существует, нет необходимости беспокоиться о том, как его реализовать.)