私はこれを実装しています:
double x;
ostringstream x_convert;
x_convert << x;
string x_str = x_convert.str();
少し余計なようです。もっとエレガントな方法はありますか?
私はこれを実装しています:
double x;
ostringstream x_convert;
x_convert << x;
string x_str = x_convert.str();
少し余計なようです。もっとエレガントな方法はありますか?
C++11 を使用していますか? その場合は、次のとおりです。
auto x_str = std::to_string(x);
std::string x_str = std::to_string(x);
あなたが持っているのは最も安全な方法です(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&)
ます。
C++11 がなければ、独自のto_string
関数を作成できます。
string to_string(double x) {
ostringstream x_convert;
x_convert << x;
return x_convert.str();
}
他の人が述べたように、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 にも同様のデバイスがあります。できればそちらを使用します。