Кратко:

Нетиповые параметры шаблонов (non-type template parameters) в C++ позволяют использовать значения (например, целые числа, указатели, ссылки) в качестве параметров шаблона. Это расширяет возможности шаблонов, делая их более гибкими и мощными.


Пример кода

Шаблонный класс с нетиповым параметром

#include <iostream>
 
// Шаблонный класс с нетиповым параметром
template<typename T, int Size>
class Array {
private:
    T data[Size];
 
public:
    constexpr int size() const { return Size; }
 
    T& operator[](int index) {
        if (index >= 0 && index < Size) {
            return data[index];
        }
        throw std::out_of_range("Index out of range");
    }
 
    const T& operator[](int index) const {
        if (index >= 0 && index < Size) {
            return data[index];
        }
        throw std::out_of_range("Index out of range");
    }
};
 
int main() {
    Array<int, 5> intArray; // Массив из 5 целых чисел
    for (int i = 0; i < intArray.size(); ++i) {
        intArray[i] = i * 2;
    }
 
    for (int i = 0; i < intArray.size(); ++i) {
        std::cout << intArray[i] << " "; // Вывод: 0 2 4 6 8
    }
    std::cout << std::endl;
 
    return 0;
}

Объяснение примера

  • Шаблонный класс Array: имеет два параметра - тип T и целое число Size.
  • Методы класса: size() возвращает размер массива, а оператор [] обеспечивает доступ к элементам массива с проверкой границ.
  • Использование шаблона: в main создается массив intArray из 5 целых чисел, инициализируется и выводится на экран.

Нетиповые параметры указателей и ссылок

Нетиповые параметры шаблонов могут быть указателями или ссылками.

#include <iostream>
 
// Шаблонный класс с нетиповым параметром указателя на функцию
template<typename T, T (*func)(T)>
class FunctionWrapper {
public:
    T operator()(T value) const {
        return func(value);
    }
};
 
int square(int x) {
    return x * x;
}
 
int main() {
    FunctionWrapper<int, square> wrapper;
    std::cout << "Square of 5: " << wrapper(5) << std::endl; // Вывод: Square of 5: 25
 
    return 0;
}

Объяснение примера

  • Шаблонный класс FunctionWrapper: принимает два параметра - тип T и указатель на функцию func.
  • Метод operator(): вызывает функцию func с переданным значением.
  • Использование шаблона: в main создается объект wrapper, который использует функцию square для вычисления квадрата числа.