проверка входного потока без знака
Я пишу часть программы, которая анализирует и проверяет некоторый пользовательский ввод в аргументах программной консоли. Я решил использовать stringstream для этой цели, но столкнулся с проблемой чтения неподписанных типов.
Следующий шаблон предназначен для чтения запрошенного типа из заданной строки:
#include <iostream>
#include <sstream>
#include <string>
using std::string;
using std::stringstream;
using std::cout;
using std::endl;
template<typename ValueType>
ValueType read_value(string s)
{
stringstream ss(s);
ValueType res;
ss >> res;
if (ss.fail() or not ss.eof())
throw string("Bad argument: ") + s;
return res;
}
// +template specializations for strings, etc.
int main(void)
{
cout << read_value<unsigned int>("-10") << endl;
}
В случае, если тип без знака и входная строка содержит отрицательное число, я ожидаю увидеть исключение (вызваноss.fail() = true
). Но stringstream производит приведение к типу без знака (4294967286 в письменном примере).
Как можно исправить этот образец для достижения желаемого поведения (предпочтительно без возврата к функциям c)? Я понимаю, что это можно сделать с помощью простой проверки первого символа, но я могу, например, поставить начальные пробелы. Я могу написать собственный анализатор, но не верю, что проблема настолько непредсказуема, и стандартная библиотека не может ее решить.
Функции, скрытые в глубоких строковых операторах для неподписанных типов: strtoull и strtoul. Они работают описанным образом, ноупомянутые функции низкого уровня, Почему stringstream не предоставляет некоторый уровень проверки? (Я просто надеюсь, что ошибаюсь, и это происходит, но для этого необходимы некоторые движения).