2009-05-21 18 views
14

Ho seguente codice:Come si costruisce una stringa std :: da un DWORD?

Tools::Logger.Log(string(GetLastError()), Error); 

GetLastError() restituisce un valore numerico DWORD, ma il costruttore di std::string non accetta una DWORD.

Cosa posso fare?

+0

(Mosso da non-risposta) Leggi [I Formattatori serie di Manor Farm] (http://www.gotw.ca/publications/mill19.htm) di Herb Sutter. È un ottimo confronto tra i diversi modi di convertire i dati in stringhe, tra cui std :: stringstream, Boost :: lexical_cast, sprintf, snprintf e std :: strstream. –

risposta

33

Si desidera leggere su ostringstream:

#include <sstream> 
#include <string> 

int main() 
{ 
    std::ostringstream stream; 
    int i = 5; 
    stream << i; 
    std::string str = stream.str(); 
} 
+1

è divertente ... chi lo sottovaluterebbe? Non penserei che questo sarebbe controverso :) –

+2

Se si dimentica #include si otterrà uno strano messaggio di errore: "errore: aggregato 'std :: ostringstream ...' ha tipo incompleto e non può essere definito". Correzione semplice. –

+1

La maggior parte delle risposte ha esattamente un downvote. Potrebbe essere qualcuno downvoted ogni risposta ma proprio? Sfortunatamente c'è più di un sospetto :) –

9

Uso di lexical_cast per i casi semplici Boost, come sopra:

Tools::Logger.Log(lexical_cast<string>(GetLastError()), Error); 
22

si desidera convertire il numero a un string:

std::ostringstream os; 
os << GetLastError(); 
Log(os.str(), Error); 

O boost::lexical_cast:

Log(boost::lexical_cast<std::string>(GetLastError()), Error); 
0

cosa faccio normalmente è:

std::ostringstream oss; 
oss << GetLastError() << " :: " << Error << std::endl; 
Tools::Logger.Log(oss.str()); // or whatever interface is for logging 
1

Usa std :: stringstream.

0

Come tutti i ragazzi qui suggeriti, l'implementazione userà lo stringstream.
Nel mio progetto attuale abbiamo creato la funzione

template <typename T> 
std::string util::str::build(const T& value); 

per creare stringa da qualsiasi fonte.

Quindi, nel nostro progetto sarebbe

Tools::Logger.Log(util::str::build(GetLastError())); 

Tale utilizzo di flussi nel modo proposto non passerebbe la mia recensione a meno che qualcuno avvolge.

+0

boost :: lexical_cast lo fa già ... – rlbond

+0

Ti piace come appare? Puoi specificarlo per il lavoro con i doppi. Per lavorare con il tuo tipo che non può essere utilizzato con lo stream? –

2

È possibile utilizzare STLSoft s' winstl::int_to_string(), come segue:

Tools::Logger.Log(winstl::int_to_string(GetLastError()), Error); 

Inoltre, se si vuole di ricercare la forma di stringa del codice di errore, è possibile utilizzare STLSoft di winstl::error_desc.

c'erano un mucchio di articoli in Dr Dobb's su questo qualche anno fa: le parti one, two, three, four. Entra nell'argomento ottimo dettaglio, in particolare sulle prestazioni.

8

Poiché C++ 11

std::to_string() con overload per int, long, long long, unsigned int, unsigned long, unsigned long long, float, double e long double.

auto i = 1337; 
auto si = std::to_string(i); // "1337" 
auto f = .1234f; 
auto sf = std::to_string(f); // "0.123400" 

Sì, io sono un fan di auto.

Per usare il tuo esempio:

Tools::Logger.Log(std::to_string(GetLastError()), Error); 
+0

Bello! Grazie per avermi insegnato sull'automobile del C++. Suppongo che sia l'equivalente C++ di 'var' che C# ha? –

+1

Sì, consultare [la pagina a cui si fa riferimento] (http://en.cppreference.com/w/cpp/language/auto). Non sono un esperto di C# quindi potrebbero esserci piccole differenze. –

Problemi correlati