Шаблон целочисленного конструктора параметров
Я не понимаю следующий конструктор (часть библиотеки Qt в src\corelib\tools\qstringbuilder.h), что это значит и как это работает?
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;
};
Ответы
Ответ 1
Конструктор принимает строковый литерал как аргумент. Вы видите только синтаксис объявления шаблона для этого.
С таким конструктором m_size может быть найден в O (1), противоположном O (strlen (str)), требуемому в противном случае с конструктором без шаблона, принимающим char const*
в качестве аргумента.
Следует помнить, что для каждой длины строки будет экземпляр шаблона, сгенерированного компилятором, чтобы в конечном итоге у вас появилось довольно много экземпляров этого шаблона в ваших библиотечных/двоичных/объектных файлах.
Ответ 2
Аргумент конструктора является ссылкой на массив символов N
. Он инициализирует m_data
, чтобы указать на первый символ, и m_size
на один меньше, чем размер массива.
Строковый литерал, например "hello"
, представляет собой массив символов, содержащий символы в строке, за которым следует нулевой знаменатель. Итак, если конструктор вызывается с одним из следующих:
QLatin1Literal lit("hello");
assert(lit.size() == strlen("hello")); // SUCCESS: m_size is inferred as 5
он выведет значение 6 для N
(так как массив содержит пять символов "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
Ответ 3
Это означает, что str
является ссылкой на массив символов N
констант. Это просто означает, что конструктор принимает в качестве аргумента массив символов, например, строковый литерал.