std::to_string、boost::to_string 和 boost::lexical_cast<std::string> 有什么区别?



boost::to_string(位于boost/exception/to_string.hpp中)的用途是什么?它与boost::lexical_cast<std::string>std::to_string有何不同?

std::to_string,自C++11起提供,专门用于基本数字类型。它还具有std::to_wstring变体。

它被设计为产生与sprintf相同的结果。

您可以选择此表单以避免依赖外部库/标头。


抛出失败函数boost::lexical_cast<std::string>及其非抛出表亲boost::conversion::try_lexical_convert处理可以插入std::ostream的任何类型,包括其他库或您自己的代码中的类型。

针对常见类型存在优化的专业化,通用形式类似于:

template< typename OutType, typename InType >
OutType lexical_cast( const InType & input ) 
{
    // Insert parameter to an iostream
    std::stringstream temp_stream;
    temp_stream << input;
    // Extract output type from the same iostream
    OutType output;
    temp_stream >> output;
    return output;
}

您可以选择此表单来利用泛型函数中输入类型的更大灵活性,或者从您知道不是基本数字类型的类型生成std::string


boost::to_string没有直接记录,似乎主要用于内部使用。它的功能类似于lexical_cast<std::string>,而不是std::to_string

还有更多的区别:boost::lexical_cast在将double转换为string时工作有点不同。请考虑以下代码:

#include <limits>
#include <iostream>
#include "boost/lexical_cast.hpp"
int main()
{
    double maxDouble = std::numeric_limits<double>::max();
    std::string str(std::to_string(maxDouble));
    std::cout << "std::to_string(" << maxDouble << ") == " << str << std::endl;
    std::cout << "boost::lexical_cast<std::string>(" << maxDouble << ") == "
              << boost::lexical_cast<std::string>(maxDouble) << std::endl;
    return 0;
}

结果

$ ./to_string
std::to_string(1.79769e+308) == 179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
boost::lexical_cast<std::string>(1.79769e+308) == 1.7976931348623157e+308

正如您所看到的,boost版本使用指数表示法(1.7976931348623157e+308),而std::to_string打印每个数字和六位小数。对于你的目的来说,一个可能比另一个更有用。我个人觉得增强版更可读。

相关内容

  • 没有找到相关文章

最新更新