How do I construct a std::string from a DWORD?
Question
I have following code:
Tools::Logger.Log(string(GetLastError()), Error);
GetLastError()
returns a DWORD
a numeric value, but the constructor of std::string
doesn't accept a DWORD
.
What can I do?
Solution
You want to read up on ostringstream:
#include <sstream>
#include <string>
int main()
{
std::ostringstream stream;
int i = 5;
stream << i;
std::string str = stream.str();
}
OTHER TIPS
You want to convert the number to a string
:
std::ostringstream os;
os << GetLastError();
Log(os.str(), Error);
Or boost::lexical_cast
:
Log(boost::lexical_cast<std::string>(GetLastError()), Error);
Since C++11
std::to_string()
with overloads for int
, long
, long long
, unsigned int
, unsigned long
, unsigned long long
, float
, double
, and long double
.
auto i = 1337;
auto si = std::to_string(i); // "1337"
auto f = .1234f;
auto sf = std::to_string(f); // "0.123400"
Yes, I'm a fan of auto
.
To use your example:
Tools::Logger.Log(std::to_string(GetLastError()), Error);
Use Boost's lexical_cast
for simple cases such as the above:
Tools::Logger.Log(lexical_cast<string>(GetLastError()), Error);
You can use STLSoft's winstl::int_to_string(), as follows:
Tools::Logger.Log(winstl::int_to_string(GetLastError()), Error);
Also, if you want to lookup the string form of the error code, you can use STLSoft's winstl::error_desc.
There were a bunch of articles in Dr Dobb's about this a few years ago: parts one, two, three, four. Goes into the subject in great detail, particularly about performance.
Use std::stringstream.
std::stringstream errorStream;
errorStream << GetLastError();
Tools::Logger.Log(errorStream.str(), Error);
what i normally do is:
std::ostringstream oss;
oss << GetLastError() << " :: " << Error << std::endl;
Tools::Logger.Log(oss.str()); // or whatever interface is for logging
As all guys here suggested, implementation will use stringstream.
In my current project we created function
template <typename T>
std::string util::str::build( const T& value );
to create string from any source.
So in our project it would be
Tools::Logger.Log( util::str::build(GetLastError()) );
Such usage of streams in the suggested way wouldn't pass my review unless someone wrap it.