【问题标题】:How do I construct a std::string from a DWORD?如何从 DWORD 构造 std::string?
【发布时间】:2010-10-27 23:28:45
【问题描述】:

我有以下代码:

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

GetLastError() 返回一个 DWORD 一个数值,但 std::string 的构造函数不接受 DWORD

我能做什么?

【问题讨论】:

  • (从未回答中移出)阅读 Herb Sutter 的 The String Formatters of Manor Farm。这是对将数据转换为字符串的不同方法的一个很好的比较,包括 std::stringstream、Boost::lexical_cast、sprintf、snprintf 和 std::strstream。

标签: c++ numeric stdstring


【解决方案1】:

您想阅读 ostringstream:

#include <sstream>
#include <string>

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

【讨论】:

  • 这很有趣......谁会反对这个?我不认为这会引起争议:)
  • 如果您忘记了#include ,您将收到一条奇怪的错误消息:“错误:聚合‘std::ostringstream ...’的类型不完整,无法定义”。简单的修复。
  • 大多数答案都只有一个反对票。会不会有人对除了他们自己的答案之外的所有答案都投了反对票?不幸的是,嫌疑人不止一个:)
  • @David 他们必须是高级代表之一。我想知道 Jon Skeet 的所有代表都去哪里了……
【解决方案2】:

您想将数字转换为string

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

boost::lexical_cast:

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

【讨论】:

    【解决方案3】:

    C++11 起

    std::to_string() 具有 intlonglong longunsigned intunsigned longunsigned long longfloatdouble 和 @9876543333@ 的重载。

    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);
    

    【讨论】:

    • 不错!感谢您教我有关 C++ 的自动功能。我假设它是 c# 具有的 'var' 的 c++ 等价物?
    • 是的,请参阅the page I referenced。我不是 C# 专家,所以可能会有细微差别。
    【解决方案4】:

    对于上述简单情况,请使用 Boost 的 lexical_cast

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

    【讨论】:

      【解决方案5】:

      可以使用STLSoftwinstl::int_to_string(),如下:

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

      另外,如果要查找错误码的字符串形式,可以使用STLSoft的winstl::error_desc

      几年前Dr Dobb's 有很多关于此的文章:零件onetwothreefour非常详细介绍了该主题,尤其是关于性能。

      【讨论】:

        【解决方案6】:

        使用 std::stringstream。

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

        【讨论】:

          【解决方案7】:

          我通常做的是:

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

          【讨论】:

            【解决方案8】:

            正如这里所有的人所建议的,实现将使用 stringstream。
            在我当前的项目中,我们创建了函数

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

            从任何来源创建字符串。

            所以在我们的项目中

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

            除非有人包装它,否则以建议的方式使用流不会通过我的审查。

            【讨论】:

            • 你喜欢它的外观吗?你能指定它与双打一起工作吗?使用您自己的无法与流一起使用的类型?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-26
            • 1970-01-01
            • 1970-01-01
            • 2014-11-01
            相关资源
            最近更新 更多