2013-03-19 38 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