
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