2012-09-07 19 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]);