проверка входного потока без знака

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

Ответы на вопрос(2)

Ваш ответ на вопрос