我正在实施这个:
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 中有类似的设备——如果可以的话,我会使用这些设备。