std::istream::getline n'existe pas. C'est une illusion d'optique. Oublie l'existence de ce truc tout pourri.Par contre, avec std::getline, c'est différent.La solution à la main:
std::string id, line;
if ((line >> id) && (std::getline(std::cin, line))) {
if (id == "EXIT") {
if ( ! line.empty()) throw ....
} elseif (id == "toto") {
std::istringstream iss(line);
float f1, f2; int i3;
if ( ! (line >> f1 >> f2 >> i3)) throw ...
do_toto(f1, f2, i3);
......
Autant dire que la gestion des erreurs complique vite la sauce.Il y a aussi des solutions pour utiliser des parsers (lex/yacc si tu es courageux, boost.spirit si ce que tu dois parser est simple, ANTLR, ....)Enfin, ton problème me fait penser aux chain-factories. Tu pourrais ainsi créer ta commande à la volée et l'exécuter par la suite. PS: Les flux n'ont jamais fait parti de la STL (qui n'est qu'une appellation historique pour un sous-ensemble de la SL du C++). Ils sont dans la SL.
[^] # Re: cin trop limité
Posté par lmg HS (site web personnel) . En réponse au message cin >> string. Évalué à 2.
std::istream::getline n'existe pas. C'est une illusion d'optique. Oublie l'existence de ce truc tout pourri.
Par contre, avec std::getline, c'est différent.
La solution à la main:
std::string id, line; if ((line >> id) && (std::getline(std::cin, line))) { if (id == "EXIT") { if ( ! line.empty()) throw .... } elseif (id == "toto") { std::istringstream iss(line); float f1, f2; int i3; if ( ! (line >> f1 >> f2 >> i3)) throw ... do_toto(f1, f2, i3); ......Autant dire que la gestion des erreurs complique vite la sauce.
Il y a aussi des solutions pour utiliser des parsers (lex/yacc si tu es courageux, boost.spirit si ce que tu dois parser est simple, ANTLR, ....)
Enfin, ton problème me fait penser aux chain-factories. Tu pourrais ainsi créer ta commande à la volée et l'exécuter par la suite.
PS: Les flux n'ont jamais fait parti de la STL (qui n'est qu'une appellation historique pour un sous-ensemble de la SL du C++). Ils sont dans la SL.