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

Value to std::string while keeping backwards compatibility

本文关键字:兼容性 std string 值为      更新时间:2023-10-16

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

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

几点:

首先,不要#ifdef CXX11_AVAILABLE要检查if __cplusplus > 201103L;有关说明,请参阅:

http://stackoverflow.com/questions/11053960/ddg#11054055

现在,无论如何,您都将至少拥有一个副本,只需将字符串管道到ostringstream中,无论您使用的是哪个C++版本。

此外,您将在每次该死的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()受返回值优化 (RVO( 的约束,这在 C++17 中是强制性的,对于早期的标准,大多数编译器都应用了它。因此,如果您使用该函数的结果初始化字符串,则oss.str()副本的构造将在该外部字符串的地址进行。

编辑:实际上,如果这是性能关键型代码,则不应使用通用字符串转换函数,并且可能根本不使用std::string。当然 - 在自定义任何内容之前,请分析并检查您在性能方面受到损害的地方。