Sí, es un parámetro no tipo. Puede tener varios tipos de parámetros de plantilla
- parámetros de tipo.
- Tipos
- plantillas (sólo clases y plantillas alias, no hay funciones o plantillas variables)
- de tipo no Parámetros
- Punteros
- Referencias
- expresiones constantes Integral
Lo que tienes allí es del último tipo. Es una constante de tiempo de compilación (llamada expresión constante) y es de tipo entero o enumeración. Después de buscarlo en el estándar, tuve que mover las plantillas de clases a la sección de tipos, aunque las plantillas no son tipos. Pero se llaman parámetros de tipo con el fin de describir esos tipos, no obstante. Puede tener punteros (y también punteros de miembro) y referencias a objetos/funciones que tienen enlaces externos (aquellos a los que se puede vincular desde otros archivos de objetos y cuya dirección es única en todo el programa).Ejemplos:
plantilla de parámetros tipo:
template<typename T>
struct Container {
T t;
};
// pass type "long" as argument.
Container<long> test;
Plantilla parámetro entero:
template<unsigned int S>
struct Vector {
unsigned char bytes[S];
};
// pass 3 as argument.
Vector<3> test;
parámetro de puntero de plantilla (que pasa un puntero a una función) parámetro de referencia Plantilla
template<void (*F)()>
struct FunctionWrapper {
static void call_it() { F(); }
};
// pass address of function do_it as argument.
void do_it() { }
FunctionWrapper<&do_it> test;
(pasando un número entero)
template<int &A>
struct SillyExample {
static void do_it() { A = 10; }
};
// pass flag as argument
int flag;
SillyExample<flag> test;
Parámetro de plantilla de plantilla.
template<template<typename T> class AllocatePolicy>
struct Pool {
void allocate(size_t n) {
int *p = AllocatePolicy<int>::allocate(n);
}
};
// pass the template "allocator" as argument.
template<typename T>
struct allocator { static T * allocate(size_t n) { return 0; } };
Pool<allocator> test;
Una plantilla sin ningún parámetro no es posible. Pero una plantilla sin ningún argumento explícito es posible - que tiene los argumentos por defecto:
template<unsigned int SIZE = 3>
struct Vector {
unsigned char buffer[SIZE];
};
Vector<> test;
sintácticamente, template<>
está reservado para marcar una especialización de plantilla explícita, en lugar de una plantilla sin parámetros:
template<>
struct Vector<3> {
// alternative definition for SIZE == 3
};
También puede usar el tipo 'static constexpr int' en lugar de su' enum'. Entonces, la plantilla 'Factorial <0>' tendría 'static constexpr int value = 1', y' template struct Factorial' puede tener 'static constexpr int value = N * Factorial :: value;' –
bobobobo