值为 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
}
如果我这样做,它会在内存中创建副本吗?
提前感谢您的回答:)
几点:
首先,不要#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
。当然 - 在自定义任何内容之前,请分析并检查您在性能方面受到损害的地方。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- 值为 std::string,同时保持向后兼容性
- g++-std=c++0x及其兼容性
- 当显式动态链接dll时,使用std::unique_lock会破坏XP的兼容性
- Std:ostream和跨平台兼容性
- 使用-std=c++11会破坏二进制兼容性吗?