2009-05-21 10 views
14

He siguiente código:¿Cómo construyo una std :: string desde un DWORD?

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

GetLastError() devuelve un valor numérico DWORD, pero el constructor de std::string no acepta una DWORD.

¿Qué puedo hacer?

+0

(Movido de la no-respuesta) Leer [Los formateadores de Cuerda de Manor Farm] (http://www.gotw.ca/publications/mill19.htm) por Herb Sutter. Es una gran comparación de las diferentes formas de convertir datos en cadenas, incluidos std :: stringstream, Boost :: lexical_cast, sprintf, snprintf y std :: strstream. –

Respuesta

33

¿Quieres leer sobre ostringstream:

#include <sstream> 
#include <string> 

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

es gracioso ... ¿quién lo menospreciaría? No creo que esto sea controvertido :) –

+2

Si olvida #include , recibirá un extraño mensaje de error: "error: aggregate 'std :: ostringstream ...' tiene un tipo incompleto y no se puede definir". Solución simple –

+1

La mayoría de las respuestas tienen exactamente un voto negativo. ¿Podría ser alguien que rechazó cada respuesta menos la suya? Lamentablemente, hay más de un sospechoso :) –

9

Uso de lexical_cast para los casos simples Boost como el anterior:

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

desea convertir el número a una string:

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

O boost::lexical_cast:

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

lo lo que normalmente hago es:

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

uso std :: stringstream.

std::stringstream errorStream; 
errorStream << GetLastError(); 
Tools::Logger.Log(errorStream.str(), Error); 
0

Como todos los tipos aquí sugeridos, la implementación usará stringstream.
En mi proyecto actual creamos la función

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

para crear cadena a partir de cualquier fuente.

Así que en nuestro proyecto sería

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

Tal uso de corrientes en la forma sugerida no pasaría mi opinión a menos que alguien lo envuelve.

+0

boost :: lexical_cast ya hace esto ... – rlbond

+0

¿Te gusta cómo se ve? ¿Puedes especificarlo para trabajar con dobles? ¿Para trabajar con tu propio tipo que no se puede usar con la transmisión? –

2

Usted puede utilizar STLSoft 's winstl::int_to_string(), de la siguiente manera:

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

Además, si desea buscar la forma de cadena del código de error, puede utilizar STLSoft de winstl::error_desc.

Había un montón de artículos en los Dr Dobb's sobre esto hace unos años: one partes, two, three, four. Entra en el tema en gran detalle, particularmente sobre el rendimiento.

8

Desde C++ 11

std::to_string() con sobrecargas para int, long, long long, unsigned int, unsigned long, unsigned long long, float, double, y long double.

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

Sí, soy un fan de auto.

Para utilizar su ejemplo:

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

¡Agradable! Gracias por enseñarme sobre el auto de C++. Supongo que es el equivalente en C++ de 'var' que tiene C#? –

+1

Sí, consulte [la página a la que hice referencia] (http://en.cppreference.com/w/cpp/language/auto). No soy un experto en C# por lo que podría haber diferencias menores. –

Cuestiones relacionadas