Что такое шаблонный класс и шаблонная функция?cplus-56

Шаблонные функции

Шаблонная функция (template function) - это функция, которая может работать с разными типами данных без необходимости переписывать код для каждого типа. Шаблоны позволяют реализовать обобщенное программирование.

Пример шаблонной функции:

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

В этом примере:

  1. template <typename T> - объявление шаблона с параметром типа T
  2. T - это параметр-тип, который будет заменен на конкретный тип при использовании функции
  3. Функция может быть вызвана с любым типом, поддерживающим оператор >

Использование:

int main() {
    std::cout << max<int>(3, 7);      // 7
    std::cout << max<double>(3.2, 7.5); // 7.5
    std::cout << max<char>('a', 'z');  // 'z'
}

Шаблонные классы

Шаблонный класс (template class) - это класс, который может работать с разными типами данных. Позволяет создавать обобщенные структуры данных.

Пример шаблонного класса:

template <typename T>
class Stack {
private:
    std::vector<T> elements;
public:
    void push(T const& elem) {
        elements.push_back(elem);
    }
    T pop() {
        if (elements.empty()) {
            throw std::out_of_range("Stack<>::pop(): empty stack");
        }
        T elem = elements.back();
        elements.pop_back();
        return elem;
    }
};

В этом примере:

  1. template <typename T> объявляет шаблон класса
  2. T используется везде, где нужен параметризованный тип
  3. Можно создать стек для любого типа данных

Использование:

int main() {
    Stack<int> intStack;       // стек для int
    Stack<std::string> strStack; // стек для строк
    
    intStack.push(42);
    strStack.push("template");
}

Основные особенности шаблонов

  1. Параметры шаблонов:

    • Могут быть типами (typename/class)
    • Могут быть конкретными значениями (не типами)
    • Могут иметь значения по умолчанию
  2. Инстанцирование:

    • Шаблон становится конкретным классом/функцией при использовании
    • Может быть явным или неявным
  3. Специализация:

    • Можно создать специализированную версию для конкретного типа
    • Позволяет оптимизировать или изменить поведение для определенных типов

Преимущества шаблонов

  1. Повторное использование кода
  2. Типобезопасность (по сравнению с макросами или void*)
  3. Производительность (отсутствие накладных расходов времени выполнения)
  4. Поддержка стандартной библиотекой (STL полностью построена на шаблонах)

Ограничения

  1. Могут увеличивать размер кода (генерируется отдельная версия для каждого типа)
  2. Сложные сообщения об ошибках
  3. Некоторые операции могут быть недоступны для определенных типов

Резюмируем: шаблоны в C++ - мощный механизм для создания обобщенного кода, позволяющий писать гибкие и эффективные программы без потери производительности и типобезопасности.