Кратко

Параметры шаблона в 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) {}
};