2012-05-31 5 views

risposta

11

Sicuro. Perché non dovrebbe essere? Esempio di dichiarazione di tale funzione:

void my_func(std::ostringstream& ss); 
+0

grazie, che quello che mi è mancato, sapevo che era un po 'possibile ma non sapevo quale dichiarazione usare per ottenere quell'effetto – rsk82

+2

Tranne che il tipo di 's" << test "<< hex << 33' non è 'std :: stringstream &', ma 'std :: ostream &', e questo non corrisponderà alla firma data. –

+0

@James Kanze Ovviamente è corretto. –

7

Assolutamente! Assicurati di passarlo per riferimento, non per valore.

void my_func(ostream& stream) { 
    stream << "Hello!"; 
} 
1

Sì, lo è, e

Function(expresion) 

renderà l'espressione da valutare prima e il risultato verrà passato come parametro

Nota: Operator << for ostreams restituisce un ostream

3

my_func deve avere una firma simile a:

void my_func(std::ostream& s); 

, poiché questo è il tipo di ss << "text" << hex << 33. Se l'obiettivo è per estrarre la stringa generata, you'ld hanno a che fare qualcosa di simile:

void 
my_func(std::ostream& s) 
{ 
    std::string data = dynamic_cast<std::ostringstream&>(s).str(); 
    // ... 
} 

Nota anche che non è possibile utilizzare un flusso temporanea;

my_func(std::ostringstream() << "text" << hex << 33); 

non verrà compilato (tranne forse con VC++), poiché non è legale C++. Si potrebbe scrivere qualcosa di simile:

my_func(std::ostringstream().flush() << "text" << hex << 33); 

se si voleva utilizzare una temporanea. Ma non è molto facile da usare.