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ć?
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ć?
Chcesz przeczytać na ostringstream:
#include <sstream>
#include <string>
int main()
{
std::ostringstream stream;
int i = 5;
stream << i;
std::string str = stream.str();
}
To zabawne ... kto by to zlekceważył? Nie sądzę, że byłoby to kontrowersyjne :) –
Jeśli zapomnisz #include
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 :) –
Zastosowanie doładowania na lexical_cast
dla prostych przypadkach, takich jak powyżej:
Tools::Logger.Log(lexical_cast<string>(GetLastError()), Error);
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);
co Zwykle robię to:
std::ostringstream oss;
oss << GetLastError() << " :: " << Error << std::endl;
Tools::Logger.Log(oss.str()); // or whatever interface is for logging
użycie std :: stringstream.
std::stringstream errorStream;
errorStream << GetLastError();
Tools::Logger.Log(errorStream.str(), Error);
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ąć.
doładowanie :: lexical_cast już to robi ... – rlbond
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? –
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.
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);
Nice! Dzięki za nauczenie mnie o auto C++. Zakładam, że jest to C++ odpowiednik "var", że C# ma? –
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. –
(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. –