Параметры шаблона, не являющиеся типом, используются во время компиляции, и создание экземпляра шаблона с уникальным значением создает новый тип или функцию. Затем эту информацию можно использовать для «конфигурации», что невозможно во время выполнения. Это несколько горизонтально по отношению к типу шаблона - параметр шаблона класса T
обеспечивает возможность повторного использования для разных типов, в то время как параметры шаблона, не являющиеся типом, предлагают другой вид повторного использования.
std::array
является хорошим примером для этого . Я предполагаю, что его определение класса имеет член данных, который представляет собой простой массив с размером N
, например,
template<class T, std::size_t N>
struct array {
// ...
T wrapped[N];
};
Если N
было значением времени выполнения (например, переданным конструктору), нет способ делать такие вещи.
Другой пример, когда такая «конфигурация» во время компиляции шаблонов классов полезна, - это «маленькие векторы», то есть контейнеры с фиксированным размером буфера, откладывающие динамическое c выделение памяти до точки, где этот буфер заполнен. Такой размер буфера также можно указать только с параметром шаблона, отличным от типа. А учитывая, что выделение памяти может быть узким местом производительности, такие методы имеют большое значение.