2011-09-02 20 views
5

Tengo dificultades para comprender la sintaxis de los parámetros de C++ Template Template. Entiendo por qué son útiles, según la excelente descripción here, su sintaxis me resulta difícil de entender. Dos ejemplos tomados de la página web anterior (hay otros):Sintaxis de la plantilla de C++ Parámetros de la plantilla

template <typename T, template <typename> class Cont> 
class Stack; 

y

template <template <typename,typename> class Cont> 
class Wrapper3; 

Es evidente que la generalización de este tipo de declaraciones es imposible sin una cierta comprensión de la lógica detrás de esta sintaxis. Memorizar es más difícil y no parece ser de mucha ayuda.

Editar: Me doy cuenta de que mi intento de hacer una pregunta apareció como una observación. Lo que estoy pidiendo es ayuda sobre cómo interpretar la sintaxis del parámetro Template Template en el habla cotidiana. Puedo hacer esto con la sintaxis de C++ y todos los demás lenguajes de programación que he aprendido. Sin embargo, tengo dificultades para "explicar" la sintaxis de los parámetros de C++ Template Template. Obtuve un libro, "Plantillas C++: la guía completa" de David Vandevoorde y Nicolai M. Josuttis, y si bien es un buen libro, no me ha ayudado mucho en la comprensión de esta sintaxis, estoy seguro muchos estarán de acuerdo en el mejor de los casos es peculiar.

+4

¿Cuál es su pregunta exactamente? –

+0

Creo que no comprende la diferencia entre las dos clases de plantilla – xanatos

+0

Entiendo que ambas son dos clases de plantilla diferentes. El problema que estoy teniendo es con la sintaxis de los parámetros de Template Template. – Olumide

Respuesta

4

No hay nada tan arcano al respecto. Basta con echar un vistazo a sus parámetros de plantilla plantilla de la plantilla original:

template <typename> class Cont 

Cualquier plantilla de clase con un único tipo de argumento se ajusta, como

template <typename T> 
class A { 
public: 
    A(T t) : t_(t) {} 
    T get() { return t_; } 
private: 
    T t_; 
}; 

Y que usaría su plantilla original como

Stack<int, A> s; 
16

No estoy seguro de cuál es exactamente su pregunta, pero esta es la explicación de los dos ejemplos que dio.

template <typename T, template <typename> class Cont> 
class Stack; 

Stack es una plantilla de clase con dos parámetros de plantilla. El primer parámetro, T puede ser de cualquier tipo (incluidos los tipos incorporados, los tipos definidos por el usuario, las instancias de plantillas, etc.). El segundo parámetro, Cont, debe ser una plantilla de clase que tome un parámetro. El parámetro no tiene nombre porque no tendría mucho sentido (el parámetro nunca está ligado a nada).

template <template <typename,typename> class Cont> 
class Wrapper3; 

Wrapper3 es una plantilla de clase con un solo parámetro, Cont. Cont debe ser una plantilla de clase con dos parámetros.

La sintaxis para definir un parámetro de plantilla de plantilla es la misma que para definir una plantilla de clase (template <typename [param1], typename [param2], ...> class Name), así que realmente no entiendo cuál es su problema.

Sin embargo, estoy de acuerdo que la sintaxis puede llegar a ser un poco incómodo cuando se inicia "anidamiento" parámetros de plantilla plantilla:

// class template whose parameter must be a class template whose parameter 
// must be a class template 
template <template <template <typename> class > class C > 
struct Wow {}; 

no sucede muy a menudo, aunque ...

+0

_ "El parámetro [template template] no tiene nombre porque no tendría mucho sentido (el parámetro nunca está ligado a nada)" _. ¿Esto significa 'plantilla clase C> clase Foo {C myField;} 'no está permitido? – mucaho

+1

@mucaho Puede asignarle un nombre al parámetro, pero no puede usarlo porque nunca está vinculado a ningún tipo. Por ejemplo, suponga que tiene la plantilla de clase' clase Barra {} ': se puede usar para instanciar' Foo' de esta manera: 'Foo f'. ¿Cuál es el tipo representado por E ¿en este caso? Si desea escribir 'Foo >', no necesita un parámetro de plantilla de plantilla, solo un parámetro regular que no sea de plantilla. –

Cuestiones relacionadas