从文字构造类似于对象的字符串,其大小在编译时是已知的

时间:2013-03-19 03:02:31

标签: c++ templates constructor struct

任何人都可以帮助解释以下构造函数的工作原理,

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

1 个答案:

答案 0 :(得分:2)

使用StringData(const char *c):_data(c){}您将不知道大小,或者必须在运行时使用strlen计算大小。除非char数组以null结尾(以char'\ 0'结尾),否则无效。

使用模板版本,编译器将在编译时计算出数组的大小,并正确初始化size成员。构造函数接受对fix-size数组的引用,编译器将根据传递给构造函数的实际数组(和大小)实例化匹配的构造函数。这一切都发生在编译时,并且不容易出现人为错误。