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

Value to std::string while keeping backwards compatibility

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

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

几点:

首先,您要检查 if __cplusplus > 201103L 而不是 #ifdef CXX11_AVAILABLE;有关解释,请参阅:

现在,不管您使用的是哪个 C++ 版本,只要将字符串通过管道传输到 ostringstream,您至少会得到一份副本。

此外,您将通过 toString() 的每个该死的调用 创建和销毁 ostringstream - 太糟糕了! ...至少做:

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全部。当然 - 在自定义任何内容之前,分析并检查您在哪些方面损害了性能。