Может ли `std:: istream:: operator >>()` принимать целые префиксы radix, такие как stdio% я спецификатор формата?

При использовании scanf() и его вариантов спецификатор формата %i будет принимать данные как hex (префикс "0x" ), восьмеричный (префикс "0" ) или десятичный (без префикса), так что, например, строки "0x10" , "020" и "16" преобразуются в целое число с десятичным значением 16.

Можно ли это сделать с помощью отформатированного ввода std::istream::operator>>?

Использование простой >> i без манипулятора i/o "0x10" преобразуется в ноль (или, скорее, в начале 0, часть "x10" не обрабатывается) и "020" - 20. hex, oct и dec действуют как %x, %o и %d соответственно. Я ищу общий целочисленный манипулятор ввода, который работает как %i.

Интересно, что манипулятор hex принимает как "0x10" , так и "10", конвертируя либо в 16 десятичных знаков.

В случае, если вам может быть интересно, я выполняю оценку выражения, и я хотел бы разрешить целочисленным операндам быть шестнадцатеричным, восьмеричным или десятичным с использованием соглашения о префиксах C/С++. Текущая реализация с использованием sscanf() делает это автоматически с помощью %i, и мне любопытно, можно ли это изменить для использования iostream без явного анализа числового формата.

Ответ 1

Базовое поле в флагах формата basic_istream диктует, как интерпретировать числа. Поле может быть установлено на dec, oct и hex. По умолчанию он установлен на dec. Если он не установлен ни в одном из них, basic_istream будет вести себя как scanf %i флаг:

// automatically detect the base, depending on prefix
std::cin.unsetf(std::ios_base::basefield);