Существует множество приложений для не типовых аргументов шаблона;Вот некоторые из них:
Вы можете использовать не типовые аргументы для реализации универсальных типов, представляющих массивы или матрицы фиксированного размера.Например, вы можете параметризовать тип Matrix
по его размерам, чтобы вы могли создать Matrix<4, 3>
или Matrix<2, 2>
.Если затем вы правильно определите перегруженные операторы для этих типов, вы можете предотвратить случайное добавление или умножение матриц неправильных измерений и создать функции, которые явно сообщают ожидаемые измерения матриц, которые они принимают.Это предотвращает возникновение огромного класса ошибок во время выполнения, обнаруживая нарушения во время компиляции.
Вы можете использовать не типовые аргументы для реализации оценки функции времени компиляции через метапрограммирование шаблона.Например, вот простой шаблон, который вычисляет факториал во время компиляции:
template <unsigned n> struct Factorial {
enum {
result = n * Factorial<n - 1>::result
};
};
template <> struct Factorial<0> {
enum {
result = 1
};
};
Это позволяет вам писать код наподобие Factorial<10>::result
, чтобы получить во время компиляции значение 10 !.Это может предотвратить выполнение дополнительного кода во время выполнения.
Кроме того, вы можете использовать не типовые аргументы для реализации размерного анализа во время компиляции , который позволяет вам определять типы для килограммов, метров, секунди т. д., так что компилятор может гарантировать, что вы случайно не используете килограммы там, где вы имели в виду метры и т. д.
Надеюсь, это поможет!