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