模板整数参数构造函数

时间:2014-02-04 12:47:45

标签: c++ templates

我不明白以下构造函数(src \ corelib \ tools \ qstringbuilder.h中的Qt库的一部分),它是什么意思以及它是如何工作的?

class QLatin1Literal
{
public:
    int size() const { return m_size; }
    const char *data() const { return m_data; }

    template <int N>
    QLatin1Literal(const char (&str)[N])
        : m_size(N - 1), m_data(str) {}

private:
    const int m_size;
    const char * const m_data;
};

3 个答案:

答案 0 :(得分:11)

构造函数将字符串文字作为参数。你看到的只是为此声明模板的语法。

使用这样的构造函数,m_size可以在O(1)中找到,与O(strlen(str)相反),否则需要使用char const*作为参数的非模板构造函数。

要记住的是,对于每个字符串长度,将有一个由编译器生成的模板实例,因此您最终可能会在库/二进制文件/目标文件中对此模板进行相当多的实例化。

答案 1 :(得分:8)

构造函数参数是对N个字符数组的引用。它初始化m_data指向第一个字符,m_size初始化为小于数组的大小。

字符串文字,如"hello",是一个字符数组,包含字符串中的字符,后跟零值终结符。因此,如果使用其中一个调用构造函数:

 QLatin1Literal lit("hello");
 assert(lit.size() == strlen("hello"));  // SUCCESS: m_size is inferred as 5

它会为N推断出值为6(因为数组包含“hello”的五个字符加上终结符),并将m_size初始化为5(实际的字符串长度)。

请注意,如果数组实际上不是字符串文字,则可能会出错;例如:

char buffer[1000] = "hello";  // array size is larger than string+terminator
QLatin1Literal lit(buffer);
assert(lit.size() == strlen("hello"));  // FAIL: m_size is inferred as 999

答案 2 :(得分:3)

这意味着str是对N个常量字符数组的引用。它只是意味着构造函数将一个字符数组作为参数,例如字符串文字。