2012-07-05 7 views
9

Estaba buscando algo más relacionado con los parámetros de la plantilla de plantilla y ocurrió en this answer que afirma que los parámetros de plantilla de la plantilla de plantilla son no permitidos por el estándar.¿Los parámetros de plantilla de la plantilla son una extensión o parte del estándar?

Sin embargo, el código siguiente se compila en el último sonido metálico (3.2) y la última GCC (4.8):

template<template<template<typename> class> class T> struct test {}; 
template<template<typename> class T> struct foo {}; 
test<foo> bar; 

¿Es esta una extensión, o es la otra respuesta realmente incorrecto y se deja por el ¿estándar? Si no, ¿hay alguna razón particular para la omisión?

+0

@chris OP probablemente significa una instantánea de 4.8. He estado usando uno por un tiempo. – juanchopanza

+0

Sí, tengo instantáneas de MacPorts ... así que, probablemente no sea la última svn ni nada de eso. – celticminstrel

+0

también se compila en gcc 4.5 en Ideone http://ideone.com/BUAuw – TemplateRex

Respuesta

8

En std::vector<int> la plantilla de clase std::vector se pasa el tipo int como parámetro. En std::get<42>(some_tuple), la plantilla de función std::get se pasa el valor 42 como parámetro. Tal vez, sin imaginación, el primer tipo de argumento se denomina argumento de tipo de una plantilla (o argumento de tipo de plantilla), mientras que la última clase es un argumento (tipo) de tipo no plantilla.

Pero las plantillas también pueden aceptar otro tipo de argumentos: otras plantillas. Por ejemplo, template<template<typename> class T> void foo(); declara una plantilla de función tomando una plantilla como argumento, que a su vez toma un argumento de tipo. (Como nota, aunque las plantillas no son tipos, el término "argumento sin tipo" aún no cubre los argumentos de la plantilla de plantilla. Se reserva para argumentos como template<int NonTypeArgument>.)

Dado que no existe una plantilla de plantilla en C++ (hay plantillas de clase, función y alias, pero en conjunto son simplemente 'plantillas' de todos modos), no existe un parámetro de plantilla de plantilla de plantilla. Lo que tiene es un parámetro de plantilla de plantilla de ejecución del molino, donde el argumento de plantilla esperado tiene un argumento de plantilla de plantilla. No puedo encontrar una referencia en el estándar que prohíba esto, como la respuesta que vincula con los reclamos.

Cuestiones relacionadas