Почему нет std :: stou? - PullRequest
       8

Почему нет std :: stou?

87 голосов
/ 03 января 2012

C ++ 11 добавлены некоторые новые функции преобразования строк:

http://en.cppreference.com/w/cpp/string/basic_string/stoul

Включает стои (строка в int), stol (строка в long), stoll (строка в long long), stoul (строка в unsigned long), stoull (строка в unsigned long long). В его отсутствие следует отметить функцию stou (string to unsigned). Есть ли какая-то причина, по которой это не нужно, но все остальные нужны?

related: Нет функций "sto {short, unsigned short}" в C ++ 11?

Ответы [ 2 ]

25 голосов
/ 03 января 2012

Наиболее частый ответ: библиотека C не имеет соответствующего «strtou», а строковые функции C ++ 11 - просто тонко завуалированные оболочки функций библиотеки C: Зеркало функций std::sto* strto*, а функции std::to_string используют sprintf.


Редактировать: Как указывает KennyTM, и stoi, и stol используют strtol в качестве базовой функции преобразования, но этовсе еще загадочно, почему, хотя существует stoul, который использует strtoul, нет соответствующего stou.

20 голосов
/ 03 января 2012

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

...