2013-12-10 5 views
0

Как получилось, что istringstream не может полностью считывать числовые литералы с помощью суффиксов?Получение длинного длинного с суффиксом из istringstream (C++)

#include <iostream> 
#include <sstream> 
using namespace std; 

int main() { 
    long long x = 123ULL; // shows 123ULL is a valid long long literal 

    istringstream iss("123ULL"); 

    iss >> x; 
    cout << "x is " << x << endl; 

    char extra; 
    iss >> extra; 
    cout << "remaining characters: "; 
    while(!iss.eof()) 
    { 
     cout << extra; 
     iss >> extra; 
    } 
    cout << endl; 

    return 0; 
} 

Выход этого кода

x is 123 
remaining characters: ULL 

Является ли это поведение контролируется локали? Может ли кто-нибудь указать мне очистить документацию о том, какие строки приняты istringstream::operator>>(long long)?

ответ

1

Да, это контролируется языковой версией (через фасет num_get), но ни один языковой стандарт, о котором я когда-либо слышал, поддерживает литералы на языке C++, и было бы неправильным местом для его настройки.

Потоки предназначены для ввода/вывода общего назначения, а суффиксы целых чисел C++ являются очень специализированными.

Точное поведение фасет по умолчанию num_get описано в стандарте C++ 11 в разделе 22.4.2.1. Описание частично ссылается на семейство функций strto* из стандартной библиотеки C. Вы можете найти несколько сокращенный вариант здесь:

http://en.cppreference.com/w/cpp/locale/num_get/get

+0

Спасибо. Не могли бы вы посоветовать стандартный способ интерпретации числовых литералов C++ в C++? – ricab

+0

Вы должны написать тип оболочки ('struct CppInt' или так) и перегрузить' operator >> 'для него. Возможно, вам захочется добавить информацию о суффиксе в структуру, например. он может иметь 'bool unsigned' и' enum Type type' (для суффиксов 'L' и' LL'), если ваша программа позаботится об этом. Но если вы разбираете то, что имеет суффиксные целые литералы, потоки, вероятно, являются неправильным способом разобрать это вообще; вы должны заглянуть в генераторы синтаксического анализатора, такие как Boost.Spirit. –