Ответ 1
Вы хотите прочитать на ostringstream:
#include <sstream>
#include <string>
int main()
{
std::ostringstream stream;
int i = 5;
stream << i;
std::string str = stream.str();
}
У меня есть следующий код:
Tools::Logger.Log(string(GetLastError()), Error);
GetLastError()
возвращает DWORD
числовое значение, но конструктор std::string
не принимает DWORD
.
Что я могу сделать?
Вы хотите прочитать на ostringstream:
#include <sstream>
#include <string>
int main()
{
std::ostringstream stream;
int i = 5;
stream << i;
std::string str = stream.str();
}
Вы хотите преобразовать число в string
:
std::ostringstream os;
os << GetLastError();
Log(os.str(), Error);
Или boost::lexical_cast
:
Log(boost::lexical_cast<std::string>(GetLastError()), Error);
Использовать Boost lexical_cast
для простых случаев, таких как:
Tools::Logger.Log(lexical_cast<string>(GetLastError()), Error);
Поскольку С++ 11
std::to_string()
с перегрузками для int
, long
, long long
, unsigned int
, unsigned long
, unsigned long long
, float
, double
и long double
.
auto i = 1337;
auto si = std::to_string(i); // "1337"
auto f = .1234f;
auto sf = std::to_string(f); // "0.123400"
Да, я фанат auto
.
Чтобы использовать ваш пример:
Tools::Logger.Log(std::to_string(GetLastError()), Error);
Вы можете использовать STLSoft winstl:: int_to_string ( ):
Tools::Logger.Log(winstl::int_to_string(GetLastError()), Error);
Кроме того, если вы хотите найти строковую форму кода ошибки, вы можете использовать STLSoft winstl:: error_desc.
Об этом несколько лет назад была куча статей в Dr Dobb's: parts один, два, три, четыре. Вникает в тему очень подробно, особенно о производительности.
Используйте std:: stringstream.
std::stringstream errorStream;
errorStream << GetLastError();
Tools::Logger.Log(errorStream.str(), Error);
что я обычно делаю:
std::ostringstream oss;
oss << GetLastError() << " :: " << Error << std::endl;
Tools::Logger.Log(oss.str()); // or whatever interface is for logging
Как предполагают все ребята, реализация будет использовать stringstream.
В моем текущем проекте мы создали функцию
template <typename T>
std::string util::str::build( const T& value );
для создания строки из любого источника.
Итак, в нашем проекте это будет
Tools::Logger.Log( util::str::build(GetLastError()) );
Такое использование потоков в предлагаемом способе не будет проходить мой обзор, если кто-то не обернет его.