Если у вас нет доступа к boost::numeric_cast
, вы можете написать простую имитацию:
template <typename T, typename S>
T range_check(const S &s) {
assert(s <= std::numeric_limits<T>::max());
assert(s >= std::numeric_limits<T>::min());
return static_cast<T>(s); // explicit conversion, no warnings.
}
return range_check<int>(strtol(some_value,0,8));
На самом деле это немного обманывает, поскольку он не работает для типов назначения с плавающей запятой. min()
для них не такая же оценка, как для целочисленных типов, вам нужно проверить +/- max()
. Упражнение для читателя.
Используете ли вы assert или какую-либо другую обработку ошибок, зависит от того, что вы на самом деле хотите сделать с неверным вводом.
Есть также boost::lexical_cast
(от руки я не знаю, как сделать это восьмеричным) и stringstream. Прочитайте нужный вам тип, а не тип, в котором есть функция библиотеки C.