2009-05-21 15 views
14

Mam następujący kod:Jak skonstruować std :: string z DWORD?

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

GetLastError() zwraca DWORD wartość liczbową, ale konstruktor std::string nie akceptuje DWORD.

Co mogę zrobić?

+0

(Przeniesiony z braku odpowiedzi) Odczyt [The String formatek z Manor Farm] (http://www.gotw.ca/publications/mill19.htm) przez Herb Sutter. Jest to świetne porównanie różnych sposobów konwertowania danych na łańcuchy, w tym std :: stringstream, Boost :: lexical_cast, sprintf, snprintf i std :: strstream. –

Odpowiedz

33

Chcesz przeczytać na ostringstream:

#include <sstream> 
#include <string> 

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

To zabawne ... kto by to zlekceważył? Nie sądzę, że byłoby to kontrowersyjne :) –

+2

Jeśli zapomnisz #include otrzymasz dziwny komunikat o błędzie: "error: aggregate" std :: ostringstream ... "ma niekompletny typ i nie można go zdefiniować". Prosta naprawa. –

+1

Większość odpowiedzi ma dokładnie jedno zdanie. Czy to możliwe, że ktoś ujął każdą odpowiedź, ale własną? Niestety jest więcej niż jeden podejrzany :) –

9

Zastosowanie doładowania na lexical_cast dla prostych przypadkach, takich jak powyżej:

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

chcesz przekonwertować liczbę do string:

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

Or boost::lexical_cast:

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

co Zwykle robię to:

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

użycie std :: stringstream.

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

Jak zasugerowali wszyscy tutaj, implementacja użyje stringstream.
W moim obecnym projekcie stworzyliśmy funkcję

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

stworzyć łańcuch z dowolnego źródła.

Dlatego w naszym projekcie byłoby

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

Takie wykorzystanie strumieni w sugerowanej sposób nie przechodzą moją opinię, chyba że ktoś go owinąć.

+0

doładowanie :: lexical_cast już to robi ... – rlbond

+0

Czy podoba Ci się jak to wygląda? Czy możesz określić to do pracy z podwójnymi. Do pracy z własnym typem, którego nie można używać ze strumieniem? –

2

Można użyć STLSoft „s winstl::int_to_string(), co następuje:

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

Ponadto, jeśli chcesz odnośnika formularz ciąg kodu błędu, można użyć STLSoft na winstl::error_desc.

Było kilka artykułów na ten temat w Dr Dobb's kilka lat temu: Części one, two, three, four. Szczegółowe informacje na temat wydajności są szczegółowo omówione w artykule.

8

ponieważ C++ 11

std::to_string() z przeciążeniem dla int, long, long long, unsigned int, unsigned long, unsigned long long, float, double i long double.

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

Tak, jestem fanem auto.

Aby użyć przykładu:

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

Nice! Dzięki za nauczenie mnie o auto C++. Zakładam, że jest to C++ odpowiednik "var", że C# ma? –

+1

Tak, patrz [strona, do której się odwoływałem] (http://en.cppreference.com/w/cpp/language/auto). Nie jestem ekspertem C#, więc mogą występować drobne różnice. –