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). 对于这种用法,我必须调用 anstrlen(s)来确定大小,然后我可以调用最后一步。这是相当疯狂的,因为我知道编译时的长度appletree

有什么好的做法吗?STL 是如何ostream使用titerals 的?

4

2 回答 2

6

由于字符串文字具有 type const char(&)[],您可以为它们添加重载:

template<size_t n>
Printer& operator<<(const char (&cstring)[n]) {
    write(cstring, n - 1);
}
于 2012-09-07T12:25:30.293 回答
3

怎么样

template<std::size_t Size>
Printer& operator << (const char (&s)[Size]);
于 2012-09-07T12:25:28.780 回答