【发布时间】:2018-07-06 00:36:04
【问题描述】:
我正在尝试输出非空终止字符串,但保持 iomanip 格式,例如std::left、std::setw 等
我当前的代码如下所示:
inline std::ostream& operator << (std::ostream& os, const StringRef &sr){
//return os.write(sr.data(), sr.size() );
// almost the same, but std::setw() works
return __ostream_insert(sr.data(), sr.size() );
}
这在使用 gcc 的 Linux 上运行正常,但在使用 clang 的 MacOS 上失败。
【问题讨论】:
-
return os << std::string(sr.data(), sr.size());? -
你可能对
std::string_view感兴趣。 -
@Someprogrammerdude 是的,并即时创建字符串,包括 malloc ... StringRef 是我自己的 string_view 实现
-
来自链接的参考:“......将每个字符......存储到输出流 os 中,就像调用
os.rdbuf()->sputn(seq, n)一样”。带有前导双下划线的符号为编译器和标准库保留,它们应被视为不可移植。链接的参考还描述了如何处理填充和字段宽度。如果您跳过哨兵对象的创建,它是一个详细的列表,您可以将其逐字复制到您自己的代码中。如果你这样做了,那么它将是可移植的。 -
@Nick 我没有看到任何迹象表明
std::string_view进行了任何内存分配。