Face à cela dans le passé, je l'ai utilisé un stringstream
avec un manipulateur qui affiche le contenu actuel du stringstream
en utilisant MessageBox
:
#include <windows.h>
#include <sstream>
#include <ostream>
std::ostream &MessageBox(std::ostream &s) {
std::ostringstream *st = dynamic_cast<std::ostringstream *>(&s);
if (NULL != st)
::MessageBox(NULL, st->str().c_str(), "", MB_OK);
return s;
}
Pour l'utiliser, la syntaxe semble une bonne quantité comme en utilisant cout
, mais avec MessageBox
en remplacement de std::endl
. Par exemple:
std::ostringstream stm;
stm << " blah blah blah. Value: " << 1213.1231 << MessageBox;
Modifier: principalement pour fnieto. Dans ce cas, le downcast vraiment est nécessaire. La raison est assez simple: un introducteur typique reçoit et renvoie une référence à un ostream:
std::ostream &operator<<(std::ostream &os, T const &t) {
// code here to insert t into os, then return os;
}
Cela prend l'objet stringstream d'origine et en silence (et en toute sécurité), il jette à simple ostream. C'est très bien en soi, et fonctionne bien pour la plupart des inserters et des manipulateurs, car ils interagissent uniquement avec l'interface ostream
eux-mêmes.
Ce manipulateur, cependant, est un peu différent - il utilise le membre str()
, que ostream
ne définit pas du tout. Pour notre appel à str()
pour résoudre et compiler, nous devons convertir le ostream &
en un , ainsi le compilateur est conscient que l'objet que nous travaillons aura vraiment un membre str()
.
Pour éliminer le downcast, nous n'aurions vraiment qu'un seul choix: rendre son paramètre . Cela fonctionne aussi longtemps que nous ne opérateurs concaténés:
my_stream << x;
my_stream << MessageBox;
mais en essayant de enchaînez les manquerions:
// should be equivalent:
my_stream << x << MessageBox;
Pire encore, le message d'erreur du compilateur va probablement essayer de dire quelque chose d'utilisateur sur std::basic_ostream<char>::str()
, ce qui n'est pas du tout mentionné dans le code de l'utilisateur. Pire encore, la plupart des gens sont suffisamment habitués à enchaîner ou ne pas donner des résultats identiques qu'il leur faudrait probablement un certain temps pour comprendre pourquoi le code fonctionnait parfois bien, et d'autres fois échouaient à compiler, avec un message d'erreur complètement indéchiffrable.
Si vous avez une application de console C++ et que vous essayez de la transformer en application Windows, c'est le moindre de vos soucis. –
Combien de boîtes de dialogue 'cout <<" Bonjour "<< nom_utilisateur;' affichage? –
@Dan - C'était une demande d'un instructeur de l'école où je travaille qui enseigne le C++ mais ne veut pas que les étudiants puissent accéder à la commande promopt. @Eric - juste 1 – CheeseConQueso