2011-09-23 19 views
6

En el Bjarne Stroustrup C++ Book (capítulo 13, página 331), decía que "se puede usar un parámetro de plantilla en la definición del parámetro de plantilla posterior". Y da el siguiente código:¿Los parámetros de la plantilla deben ser tipos?

template<class T, T def_val> class Cont{ /* ... */ } 

Puede alguien dar un ejemplo de cómo utilizar esta plantilla. Por ejemplo, ¿cómo inicializar un objeto de Cont? Me parece que "def_val" no es un argumento de tipo, y no debe colocarse en <>. ¿Me equivoco?

Muchas gracias

+3

debe saber que esto es válido solo si T es un tipo integral – Riga

Respuesta

7

se puede hacer algo como esto:

Cont<int, 6> cnt; 
//  ^as long as this is of type T (in this case int) 
// def_val will be of type int and have a value of 6 

parámetros de plantilla no están obligados a ser tipos.

Esto sólo funciona cuando T es un tipo entero (int, unsigned, long, char etc, pero no float, std::string, const char*, etc), como @Riga mencionado en su/su comentario.

6

def_val es un argumento de valor. Una instancia podría tener este aspecto:

Cont<int, 1> foo; 

Un caso interesante en donde esto es útil es cuando se desea tener un puntero a una clase miembros como plantilla Paremeter:

template<class C, int C::*P> 
void foo(C * instance); 

Esto permite foo estar instanciado con un puntero a un miembro del tipo int de cualquier clase.

+2

Aunque creo que el término correcto es 'parámetro de plantilla no de tipo '. – pmr

3

Aquí está un ejemplo de cómo crear una instancia de lo anterior:

template<class T, T def_val> class Cont{ /* ... */ }; 

int main() 
{ 
    Cont<int,42> c; 
} 
2

T def_val es un objeto de tipo T (que fue aprobada previamente). Podría usarse para inicializar elementos en el contenedor, por ejemplo. Para utilizar, se vería algo como:

Object init(0); 
Cont<Object, init> cont; 

(pseudo-código; Object debe ser, obviamente, un tipo que es legal el uso de esta forma)

que luego utiliza el segundo parámetro de plantilla. Está incluido en la plantilla porque tiene un tipo de plantilla; def_val debe ser del tipo T y se debe pasar cuando se crea el objeto.

+0

No sé si esto funciona. ¿Tal vez si el constructor de Object es constexpr? –

+0

Agregó un poco de un descargo de responsabilidad. – ssube

Cuestiones relacionadas