2012-09-07 20 views
3

假设我有一些内部的文件和流的框架。我有IOutputStream接口类与write(char const *buffer, size_t size)flush()。我有一个叫做Printer的工具,它可以用于任何IOutputStream后代的实例。然后我有Printer & operator<<(T x)风格的方法,其中T x是要写入的数据(或其引用或指针)。C++中的流式字符串文字

例如Printer & operator<<(int x)会将x转换为字符串,并将调用引用的输出流的write(...)函数为真。

让我们来看看问题!调用:printer << "appletree";。它叫Printer & operator<<(char const *s)。对于这种用法,我必须拨打strlen(s)来确定大小,然后我可以调用最后一步。这是相当疯狂的,因为我知道编译时的长度为appletree

有没有什么好的做法呢? STL的ostream如何玩titerals?

+0

是为'strlen'性能瓶颈的电话吗?就个人而言,我只需要通过'strlen'调用即可轻松读取代码(假设它不是性能问题)。 – deanWombourne

+0

看到这个[对另一个问题的回答](http://stackoverflow.com/a/11639305/597607),它表明有时编译器能够在编译时计算'strlen(“some text”)''。只要称呼它,并希望最好。就你而言,我敢打赌,无论如何,打印机将成为瓶颈。 –

回答

6

由于字符串字面量有型const char(&)[],你可以添加一个过载为他们:

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

您可以在描述字符串文字类型的地方添加引用吗? – Notinlist

+1

@Notinlist你去了:http://msdn.microsoft.com/en-us/library/69ze775t%28v=vs.80%29.aspx – mfontanini

3

如何

template<std::size_t Size> 
Printer& operator << (const char (&s)[Size]);