Кратко:
Нетиповые параметры шаблонов (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для вычисления квадрата числа.