1

私はこれを実装しています:

double x;
ostringstream x_convert;
x_convert << x;
string x_str = x_convert.str();

少し余計なようです。もっとエレガントな方法はありますか?

4

5 に答える 5

10

C++11 を使用していますか? その場合は、次のとおりです。

auto x_str = std::to_string(x);
于 2013-10-30T18:09:28.183 に答える
4

std::to_string:

std::string x_str = std::to_string(x);
于 2013-10-30T18:09:08.917 に答える
3

あなたが持っているのは最も安全な方法です(C++ 11より前)。

または、次のようにすることもできます。

double value = SOME_VALUE;
char buffer[100] = {};
sprintf(buffer, "%f", value);
std::string s = buffer;

これは機能的に何と同等std::to_stringです。に十分なスペースを割り当てるように注意する必要がありますbuffer(ご覧のとおり)、この変換を行うためにまだ約 4 行のコードを書いているため、他の方法よりも洗練されているわけではありません (劣っているわけでもありません)。

C++11 より前に行き詰まっている場合は、次のto_stringような方法で独自の実装を行うことができます。

template<typename T>
std::string to_string(T t)
{
    std::ostringstream oss;
    oss << t;
    return oss.str();
}

これは、 のオーバーロードが既にある任意の型で機能しstd::ostream& operator<<(std::ostream&, T&)ます。

于 2013-10-30T18:46:41.613 に答える
2

C++11 がなければ、独自のto_string関数を作成できます。

string to_string(double x) {
  ostringstream x_convert;
  x_convert << x;
  return x_convert.str();
}
于 2013-10-30T18:37:38.287 に答える
1

他の人が述べたように、C++ 11では、を使用しますstd::to_string

C++11 がなければ、すでに書いたコードか、それに沿った何かに行き詰まることになります。文字列の作成を行うデバイスを作成することで、そのコードをもう少しエレガントに使用できます (タイピングを減らすことができます)。

class StringBuilder
{
public:
    template <typename T> inline StringBuilder& operator<<(const T& t)
    {
        mStream << t;
        return * this;
    }
    inline std::string get() const
    {
        return mStream.str();
    }
    inline operator std::string () const
    {
        return get();
    }
private:
    std::stringstream mStream;
};

次のことができるようになりました。

double x;
string x_str = StringBuilder() << x;

しかし、結局のところ、それは同じことの構文糖衣にすぎません。Boost にも同様のデバイスがあります。できればそちらを使用します。

于 2013-10-30T18:14:20.910 に答える