Преобразование строки в число
Запись от Loafer размещена 02.10.2020 в 14:42
Показов 2094
Комментарии 5
Метки c++
Функция, проверяющая, что входная строка содержит корректное для заданного целочисленного типа значение в пределах допустимых значений. На вход передается строка, а необходимый целочисленный тип задается как параметр шаблона.
| |||||
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 5
Комментарии
-
Чем это лучше чем использовать std::strtoX...
Например как я тут https://github.com/Avazart/Arg... ingUtils.h см ф-цию convertЗапись от Avazart размещена 02.10.2020 в 15:54
-
Функции из разряда
Сообщение от Avazart
std::strtoX, которые работают с беззнаковыми типами, не считают за ошибку, если им на вход приходит строка, представляющая собой отрицательное число.
Плюс интрейфейс удобный. Если нужно проверить, что значение в строкеstrлежит в пределах типаint, то функцию надо использоваться следующим способом:
C++ 1
bool result = check_is_integral<int>(str);
Запись от Loafer размещена 02.10.2020 в 16:02
-
Запись от Avazart размещена 02.10.2020 в 18:55
-
Вот в этом месте, наверное:
Сообщение от Avazart
Но под каждый целочисленный тип данных у Вас своя функция. А что делать, если надо преобразовать в std::size_t? В зависимости от архитектуры процессора (x86 или amd64) тип имеет разный размер.C++ 1 2
if(is_unsigned_v<T> && s[0] == CharT('-')) throw out_of_range("out of range");
Запись от Loafer размещена 02.10.2020 в 19:41
-
Да наверное под size_t тоже стоило свою ф-цию завести.
Но если Вы заметили все ф-ции вызывают шаблонную ф-цию convert так что с этим не должно быть проблем.
Т.е. как то так:
P.S: Смотря на этот случай понял что стоит написать проверку по размерам типов, а не равенству типов.C++ 1 2 3 4 5
template<typename CharT> auto strToSizeT(const std::basic_string<CharT>& s) { return detail::convert<unsigned long long,size_t>(s,std::strtoull,std::wcstoull); };
Запись от Avazart размещена 03.10.2020 в 11:00


