web-dev-qa-db-ja.com

std :: to_string、boost :: to_string、boost :: lexical_cast <std :: string>の違いは何ですか?

boost::to_stringboost/exception/to_string.hppにあります)の目的は何ですか?また、boost::lexical_cast<std::string>およびstd::to_stringとどのように異なりますか?

21
Claudiu

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のように動作します。

28
Drew Dormann

さらに違いがあります。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

ご覧のとおり、ブーストバージョンは指数表記(1.7976931348623157e + 308)を使用しますが、std :: to_stringはすべての桁と小数点以下6桁を出力します。あなたの目的のために1つは別のものより役に立つかもしれません。個人的には、ブーストバージョンの方が読みやすいと思います。

8
Claus Klein