简单实用程序函数,用于将值转换为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
}
如果我这样做,它会在内存中创建一个副本吗?
提前感谢您的回答:)
答案 0 :(得分:2)
几点:
首先,您需要检查#ifdef CXX11_AVAILABLE
,而不是if __cplusplus > 201103L
;有关解释,请参阅:
http://stackoverflow.com/questions/11053960/ddg#11054055
现在,无论如何,你将至少有一个副本,只需将字符串汇总到ostringstream
,无论你使用的是哪个C ++版本。
此外,你将要创建并摧毁ostringstream
每次该死的电话到toString()
- 这太可怕了! ......至少做:
namespace detail {
inline std::ostringstream& get_ostringstream(){
static thread_local std::ostringstream stream;
stream.str("");
stream.clear();
return stream;
}
} // namespace detail
然后在toString()
中,替换
std::ostringstream oss;
与
std::ostringstream& oss = detail::get_ostringstream();
最后,请记住最终副本 - oss.str()
受Return Value Optimization (RVO)的约束,这在C ++ 17中是强制性的,大多数编译器都应用早期标准。因此,如果使用函数的结果初始化字符串,则oss.str()
副本的构造将发生在该外部字符串的地址处。
编辑:实际上,如果这是性能关键代码,您应该不使用通用字符串转换函数,并且可能根本不使用std::string
。当然 - 在定制任何内容之前,请查看并检查您在哪里损害性能。