
Envoyé par
NiamorH
L'inconvenient ici c'est que l'operateur d'affectation doit etre disponible.
C'est pas très beau mais c'est pas mal comme astuce.
1 2 3 4 5 6
| int fonction( int ancien, NouvelObjet & nouvelle fonctionnalité);
inline int fonction( int ancien = 1) {
NouvelObjet tmp;
fonction (ancien, tmp);
} |
Oui c'est l'une des solution que j'ai déjà évoqué.
C'est juste une façon de faire qui marche ici.
En général, c'est plutôt sur des classes qui n'ont pas de notion de copie qu'on a besoin d'une telle chose, notamment ostrstream (traditionnellement)/ostringstream (actuellement).
En traditionnel :
char *p = ((ostrstream&)(ostrstream() << ...)).str(); // cast ancien style, c'est du traditionnel!
Mais ostrstream() est un temporaire, donc si on voulait sortir une classe Date :
1 2
| class Date;
ostream& operator<< (ostream& os, const Date& d); |
ça marchait pas, évidement (référence liée à une r-valeur, vous connaissez la musique).
Alors, on écrivait :
char *p = ((ostrstream&)(ostrstream() << "" << date << ...)).str();
parce que la sortie de const char * était
ostream& ostream::operator<< (const char*)
donc fonction membre, ça marche, << "" est un NOP, ça nous donne une l-valeur, super.
Il se trouve, malheureusement, et bizarrement, que le comité, dont les voies sont vraiment impénétrables, a décidé qu'il valait mieux que cette fonction soit non-membre (ou alors, il a juste décidé ça à "pile-ou-face").
Donc cette astuce ne fonction plus! Mais il reste heureusement des fonctions qui ne font rien et qui renvoient une référence sur *this, et d'habitude on utilise flush() pour ça (on en a souvent besoin sur un ostringstream, et flush ne fait strictement rien sur un ostringstream) :
std::string s = (static_cast<std::ostringstream&>(ostringstream().flush() << ...)).str();
Partager