if (v2 < v1) return 1;
return 0;
}
Определение шаблона начинается с ключевого слова template
, за которым следует разделяемый запятыми и заключенный в угловые скобки (<>
)
Список параметров шаблона очень похож на список параметров функции. Список параметров функции задает имена и типы локальных переменных, но оставляет их неинициализированными. Инициализацию параметров во время выполнения обеспечивают аргументы.
Аналогично параметры шаблона представляют типы или значения, используемые при определении класса или функции. При использовании шаблона необходимо (явно или неявно) определить
Например, рассматриваемая функция compare()
объявляет единственный параметр типа Т
. В шаблоне compare
имя Т
можно использовать там, где должно быть название типа данных. Т
будет определен компилятором на основании способа применения функции.
Когда происходит вызов шаблона функции, для вывода типов аргументов шаблона компилятор обычно использует аргументы вызова. Таким образом, когда происходит вызов шаблона compare
, компилятор использует тип аргументов для определения типа, связанного с параметром шаблона Т
. Рассмотрим следующий вызов:
cout << compare(1, 0) << endl; //
Здесь аргумент имеет тип int
. Компилятор выведет и использует тип int
как аргумент шаблона, а также свяжет этот аргумент с параметром Т
шаблона.
При
//
cout << compare(1, 0) << endl; //
//
//
vector
cout << compare(vec1, vec2) << endl; //
Здесь компилятор создает два экземпляра разных версий функции compare()
. В первой из них параметр Т
заменен типом int
.
int compare(const int &v1, const int &v2) {
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
Во втором вызове создается версия функции compare()
с параметром Т
, замененным типом vector
. Такое создание компилятором функций обычно и называют
У функции compare()
есть один
//
template
Т tmp = *p; //
// ...
return tmp;
}
Каждому параметру типа должно предшествовать ключевое слово class
или typename
:
//
template
В списке параметров шаблона эти ключевые слова имеют одинаковый смысл и применяются взаимозаменяемо. Оба ключевых слова применимы одновременно:
//
//
template