std :: string的值,同时保持向后兼容性

时间:2018-05-14 09:10:15

标签: c++ c++11 tostring

简单实用程序函数,用于将值转换为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
     }

如果我这样做,它会在内存中创建一个副本吗?
提前感谢您的回答:)

1 个答案:

答案 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。当然 - 在定制任何内容之前,请查看并检查您在哪里损害性能。