2013-03-19 45 views
0

任何一個可以幫助解釋下面的構造是如何工作是已知的,結構串像文字,其大小在編譯時

class StringData { 
    public: 
    /** 
    * Constructs a StringData explicitly, for the case of a literal whose size is known at 
    * compile time. 
    */ 
    struct LiteralTag {}; 
    template<size_t N> 
    StringData(const char (&val)[N], LiteralTag) 
     : _data(&val[0]), _size(N-1) {} 

private: 
    const char* _data;  // is not guaranted to be null terminated 
    mutable size_t _size;  // 'size' does not include the null terminator 
} 

爲什麼不直接使用此構造對象嗎?

StringData(const char *c):_data(c){} 

完整的源代碼可以在這裏找到:http://api.mongodb.org/cplusplus/1.7.1/stringdata_8h_source.html

+3

因爲那個不設置大小... – chris 2013-03-19 03:03:28

+0

@chris我可以輕鬆地將大小添加到第二個。爲什麼不添加_size = strlen(c);在身體裏?是否有必要創建如此複雜的構造函數來克服大小? – JiuDong 2013-03-19 03:29:12

+0

雖然分配量很大,但它會節省大量時間,而不是'strlen',它應該遍歷每個字符串的末尾 – borisbn 2013-03-19 03:40:09

回答

2

隨着StringData(const char *c):_data(c){}你不會知道的大小,或將要弄清楚在運行時使用strlen大小。除非char數組以null結尾(以char'\ 0'結尾),否則這將不起作用。

使用模板版本,編譯器將在編譯時計算出數組的大小,並正確初始化size成員。構造函數接受對固定大小數組的引用,編譯器將根據傳遞給構造函數的實際數組(和大小)實例化一個匹配構造函數。這一切都發生在編譯時,不太容易出現人爲錯誤。

+0

對,謝謝 – JiuDong 2013-03-19 04:43:28