在C++中流式传输字符串字面量

3
假设我有一些内部框架用于文件和流。我有一个 IOutputStream 接口类,其中包含 write(char const *buffer, size_t size)flush() 方法。我有一个名为 Printer 的工具,可与任何 IOutputStream 后代一起使用。然后我有 Printer & operator<<(T x) 风格的方法,其中 T x 是要写入的数据(或对其的引用或指针)。
例如 Printer & operator<<(int x) 将把 x 转换为字符串,并调用引用输出流的 write(...) 函数进行实际写入。
让我们看看问题!调用:printer << "appletree";。它会调用 Printer & operator<<(char const *s)。对于这种类型的用法,我必须调用 strlen(s) 来确定大小,然后才能调用最终步骤。这相当不合理,因为我在编译时就知道了 appletree 的长度。
有没有好的做法?STL 的 ostream 如何处理文字?

调用 strlen 是否会成为性能瓶颈?个人而言,我会选择承受 strlen 调用的代价,以保持代码简洁易读(假设这不会影响性能)。 - deanWombourne
参见这个另一个问题的答案,它表明有时编译器将能够在编译时计算strlen("some text")。只需调用它,然后希望一切顺利。在你的情况下,我打赌打印机无论如何都会成为瓶颈。 - Bo Persson
2个回答

6

由于字符串字面量具有类型const char(&)[],因此您可以为其添加重载:

template<size_t n>
Printer& operator<<(const char (&cstring)[n]) {
    write(cstring, n - 1);
}

请问您能否添加一个描述字符串字面量类型的参考文献? - Notinlist
1
@Notinlist,这是链接:http://msdn.microsoft.com/zh-cn/library/69ze775t(v=vs.80).aspx - mfontanini

3
如何呢?
template<std::size_t Size>
Printer& operator << (const char (&s)[Size]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接