2014-12-10 12 views
5

Questo funziona:È possibile utilizzare un oggetto temporaneo per stringhe?

stringstream temp; 
temp << i; 
result_stream << transform(temp.str()); 

(transform è una funzione che prende un string e restituisce un string; i è un int). Tuttavia, il mio tentativo di lasciare C++ 11 creare un oggetto temporaneo senza un nome non ha funzionato:

result_stream << transform((stringstream() << i).str()); 

ho pensato che avrebbe funzionato, dal momento che il secondo << dovrebbe semplicemente restituire il primo argomento e sarei in grado di utilizzare str() su quello. Ma ottengo questo errore:

error: 'class std::basic_ostream<char>' has no member named 'str' 

Sto usando g ++ 4.8.1 (MinGW-W64).

C'è un modo per realizzare questo (ad esempio scrivere codice come questo utilizzando un temporaneo senza nome)? (Il codice sopra è un po 'semplificata, e il codice effettivo comporta l'uso << su argomenti diversi int.)

+0

Per questa attività, prenderei in considerazione l'idea di creare una funzione che converta int in stringa, specialmente se g ++/MinGW-64 non supporta ancora std :: to_string –

+0

possibile duplicato di [Usa un Stringhe di stringa anonimo per Costruire una stringa] (http://stackoverflow.com/questions/19665458/use-an-anonymous-stringstream-to-construct-a-string) –

risposta

6

Questo non funziona perché il secondo << è std::ostream &operator<<(std::ostream &, int); e quindi il tipo di ritorno è ostream& che non ha alcun membro str().

Lei avrebbe dovuto scrivere:

result_stream << transform(static_cast<stringstream &>(stringstream() << i).str()); 
+0

Grazie, funziona. Ma sta iniziando a sembrare un po 'peloso, e non funziona quando "i" è sostituito da un'espressione della mia stessa classe, per la quale avevo definito un amico "operatore". Quindi probabilmente non lo porterò oltre. – ajb

6

Il risultato dell'operatore << sul temporaneo stringstream è un ostream. Non esiste il metodo str() su un ostream.

Uso to_string invece:

result_stream << transform(std::to_string(i)); 
4

operator<<() restituisce un riferimento alla classe di base std::ostream contenuto all'interno del std::stringstream. La classe base non contiene il metodo str(). Si può lanciare di nuovo verso il basso per un std::stringstream&:

result_stream << transform(static_cast<std::stringstream&>(std::stringstream() << i).str()); 
3

provato e non è riuscito a fare questo per C++ 11 (nel 2009):

http://cplusplus.github.io/LWG/lwg-active.html#1203

libC++ è andato fuori legge e attuata comunque.

Spetta al riesame, ma non può essere standardizzato prima del 2017 (la standardizzazione è un processo glaciale).

+0

Molto utile, grazie! – ajb

Problemi correlati