【发布时间】:2018-05-14 09:10:14
【问题描述】:
在保持向后兼容性的同时将值转换为 std::string 的简单实用函数。
可能是一个愚蠢的问题,但我很想听听一些关于它的意见,或者这样做是否有任何缺陷:
template<typename T>
std::string toString(T parm)
{
#ifdef CXX11_AVAILABLE
return std::to_string(parm);
#else
std::ostringstream stream;
stream << parm;
return stream.str();
#endif
}
如果我这样做,它会在内存中创建一个副本吗?
提前感谢您的回答:)
【问题讨论】:
-
是的,直到 c++17
ostringstream::str()返回底层字符串的副本。从 c++17 开始,str()具有 r 值形式。 -
@RichardHodges 谢谢! DevSolar 谢谢你的参考,但老实说,我已经看过那篇文章,它对向后兼容性并不是很具体。您能否解释一下为什么 __cplusplus 定义会检查 C++11?
-
您的模板接受各种 T 但
std::to_string()将无法转换char[]或const char *而std::ostringstream将。 -
@RichardHodges:那不是 C++17;那是C++ 20。并且它将具有不同的功能,而不是 r 值重载。
-
@RichardHodges
ostringstream::str()是纯右值(任何按值返回的函数调用也是如此)。我猜你指的是一些未来的函数,它将把底层字符串移出 ostringstream; C++17 中没有这样的东西