2017-08-10 4 views
-2

Comment obtenez-vous un std::stringstream à retourner le le prochain jeton, au lieu de l'extraire dans une variable avec operator>>?Comment renvoyer le jeton suivant d'une chaîne de caractères sans opérateur >>?

J'ai inclus quelques exemples de pourquoi je voudrais faire ceci ci-dessous. J'ai essayé get(), mais cela renvoie juste le caractère suivant. La raison principale de ceci est de produire du code plus propre quand je ne veux pas stocker ou réutiliser le prochain jeton. Sinon, le code est rempli avec les lignes ss >> token.

+1

'ss >> token; // Je ne veux pas ça "Pourquoi? Quel est le problème avec ça? – DimChtz

+2

Tout ce que vous feriez avec 'ss.next()' peut être obtenu avec 'ss >> token'. Cela peut prendre un autre pas, mais il en résultera probablement un code plus propre à long terme. –

+0

@DimChtz J'ai donné des exemples de pourquoi je ne le veux pas dans la question. –

Répondre

3

Écrire une fonction.

template<typename T = std::string> 
T next(std::istream& is) { 
    T value; 
    if (is >> value) 
     return value; 
    else 
     throw an_exception_or_something; 
} 

Ensuite, vous pouvez le faire:

if (next<>(ss) == "abc") 
    do_something(); 
int x = next<int>(ss); // note: no need for stoi 

Vous pouvez également retourner un std::optional, si votre application supporte.

template<typename T = std::string> 
std::optional<T> next(std::istream& is) { 
    T value; 
    if (is >> value) 
     return value; 
    else 
     return std::nullopt; 
} 

Ensuite, vous pouvez décider comment gérer les pannes sur le site d'appel.

int x = *next<int>(ss);   // undefined behavior on error 
int y = next<int>(ss).value();  // throws exception on error 
int z = next<int>(ss).value_or(0); // return a default value on error 
+0

Maintenant que je comprends ce qu'il essaie de faire, cela ressemble à une bonne solution. – Barmar