Этот ответ должен быть довольно коротким и сладким, чтобы ответить (часть) озаглавленного вопроса. Если вы хотите получить более подробный ответ, объясняющий, почему вы должны их там поместить, пожалуйста, перейдите здесь .
Общее правило для размещения typename
в основном, когда вы используете параметр шаблона, и хотите получить доступ к вложенному typedef
или с использованием псевдонима, например:
template
struct test {
using type = T; // no typename required
using underlying_type = typename T::type // typename required
};
Обратите внимание, что это также относится к метафункциям или вещи, которые также принимают общие параметры шаблона. Однако, если предоставленный параметр шаблона является явным типом, вам не нужно указывать typename
, например:
template
struct test {
// typename required
using type = typename std::conditional::type;
// no typename required
using integer = std::conditional::type;
};
Общие правила добавления определителя template
в основном аналогичны, за исключением они обычно включают шаблонные функции-члены (статические или другие) структуры / класса, которые сами шаблоны, например:
Учитывая эту структуру и функцию:
template
struct test {
template
void get() const {
std::cout << "get\n";
}
};
template
void func(const test& t) {
t.get(); // error
}
Попытка доступа t.get
изнутри функции приведет к ошибке:
main.cpp:13:11: error: expected primary-expression before 'int'
t.get();
^
main.cpp:13:11: error: expected ';' before 'int'
Таким образом, в этом контексте вам понадобится ключевое слово template
заранее и вызвать его так:
t.template get
Таким образом, компилятор будет анализировать это правильно, а не t.get < int
.
Возможно. В целом, если будет такой индекс, то он будет использовать сканирование диапазона на том индексе, если не будет никакого "лучшего" индекса на запросе. Однако, если оптимизатор решит, что диапазон закончил бы тем, что был слишком большим (т.е. включал бы больше, чем, сказал бы 1/3 строк), то он, вероятно, не будет использовать индекс вообще, поскольку сканирование таблицы, вероятно, было бы быстрее.
Используйте ОБЪЯСНЯЮТ (на ВЫБОРЕ; Вы не можете ОБЪЯСНИТЬ удаление) определить его решение в конкретном случае. Это, вероятно, будет зависеть от
Индекс B-дерева может использоваться для сравнений столбца в выражениях, которые используют =,>,> =, <<=, или операторы BETWEEN.
Для большого количества строк это может быть намного быстрее к поиску строки через древовидный индекс, чем посредством сканирования таблицы. Но поскольку другие ответы указывают, используют EXPLAIN
узнать решение MySQL.
Индекс на поле даты и времени определенно поможет с основанными на диапазоне дат поисками. Мы используем их все время в наших базах данных, и запросы являются смехотворно медленными без индексов.
Это делает, сверяется с таблицей DESCRIBE SELECT FROM...