Кратко
Параметры шаблона в C++ позволяют обобщать не только типы данных, но и значения. Параметры шаблона могут быть типами, значениями или шаблонами других шаблонов.
Параметры типа
Параметры типа задаются с использованием ключевого слова typename
или class
.
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
Параметры значений
Параметры значений могут быть целочисленными значениями, указателями или ссылками.
template <typename T, int size>
class Array {
private:
T arr[size];
public:
T& operator[](int index) {
return arr[index];
}
};
Параметры шаблонов
Шаблоны могут принимать в качестве параметров другие шаблоны.
template <template <typename> class Container, typename T>
void printContainer(const Container<T>& c) {
for (const auto& element : c) {
std::cout << element << std::endl;
}
}
Примеры использования
Пример с параметрами типа
#include <iostream>
template <typename T>
T min(T a, T b) {
return (a < b) ? a : b;
}
int main() {
std::cout << "Min of 3 and 7: " << min(3, 7) << std::endl;
std::cout << "Min of 3.5 and 2.1: " << min(3.5, 2.1) << std::endl;
return 0;
}
Пример с параметрами значений
#include <iostream>
template <typename T, int size>
class Array {
private:
T arr[size];
public:
void set(int index, T value) {
arr[index] = value;
}
T get(int index) const {
return arr[index];
}
};
int main() {
Array<int, 5> intArray;
intArray.set(0, 42);
std::cout << "Element at index 0: " << intArray.get(0) << std::endl;
return 0;
}
Пример с параметрами шаблонов
#include <iostream>
#include <vector>
template <template <typename, typename> class Container, typename T>
void printContainer(const Container<T, std::allocator<T>>& c) {
for (const auto& element : c) {
std::cout << element << std::endl;
}
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
printContainer(vec);
return 0;
}
Особенности и советы
- Выведение типа: Компилятор C++ может автоматически выводить типы параметров, что упрощает вызов шаблонов функций.
template <typename T>
void foo(T a) {
// ...
}
int main() {
foo(42); // T будет выведен как int
}
- Необязательные параметры шаблона: В C++17 были введены шаблоны с параметрами по умолчанию.
template <typename T = int>
class MyClass {
// ...
};
- Шаблоны с несоответствующими типами: Возможно создание шаблонов с несколькими параметрами различных типов.
template <typename T1, typename T2>
class Pair {
T1 first;
T2 second;
public:
Pair(T1 f, T2 s) : first(f), second(s) {}
};