varias resueltos respuestas letras funciones funcion ejemplos condiciones con combinacion anidado anidada c++ templates c++11 variadic-templates

c++ - resueltos - ¿Por qué esta plantilla variadica anidada es un argumento inválido?



funcion si con varias condiciones y varias respuestas (2)

Como Barry dijo antes sobre:

ABC<int,bool,char>::DEF<4,true,''c''> foo

Y pruebe y trabajó en el compilador en línea de Coliru gcc 5.1 c ++ 14 en este sitio Compiler :

#include <iostream> template <template <int,bool,char> class> struct Bar {}; template <int,bool,char> struct Zod {}; Bar<Zod> a; struct GHI { template <int,bool,char> struct JKL {}; }; Bar <GHI::JKL> b; template <template <typename... Ts> class> struct Base {}; template<typename... Ts> struct Floor {}; Base<Floor> c; template <typename... Ts> struct ABC { template <Ts... val> struct DEF {}; }; ABC<int,bool,char>::DEF<4,true,''c''> foo;

Hice una búsqueda y encontré esta lista de parámetros de plantilla.

La expansión del paquete puede aparecer en una lista de parámetros de plantilla:

template<typename... T> struct value_holder { template<T... Values> // expands to a non-type template parameter struct apply { }; // list, such as <int, char, int(&)[5]> };

donde probé algunas cosas en el compilador de código de ejecución en: http://en.cppreference.com/w/cpp/language/parameter_pack pero también encontré este elipsis y plantillas variables en visual studio 2013: https://msdn.microsoft.com/en-us/library/dn439779.aspx

Si defino una Bar plantilla de struct que acepta un argumento de plantilla:

template <template <int,bool,char> class> struct Bar {};

Puedo instanciarlo usando una plantilla de struct como Zod :

template <int,bool,char> struct Zod {}; Bar<Zod> a;

También puedo instanciarlo usando una plantilla de struct anidada como JKL :

struct GHI { template <int,bool,char> struct JKL {}; }; Bar <GHI::JKL> b;

¿Por qué no puedo instanciar Bar usando una plantilla de struct variada anidada como DEF ?

template <typename ...Ts> struct ABC { template <Ts ...> struct DEF {}; }; Bar<ABC<int,bool,char>::DEF> c;

G ++ 4.9.2 se queja de un desajuste de tipo / valor; mientras que el error de Clang 3.4.2 informa que el argumento de plantilla de plantilla tiene diferentes parámetros de plantilla que su parámetro de plantilla de plantilla correspondiente.


Vamos a darle un nombre al paquete de parámetros de DEF para facilitar la referencia:

template <typename ...Ts> struct ABC { template <Ts ... Values> struct DEF {}; };

El punto clave aquí es que [temp.param] / p15, Ts... Values es tanto una expansión de paquetes de Ts como una declaración de un paquete de parámetros Values .

Si un parámetro de plantilla es una [...] declaración de parámetro que declara un paquete de parámetros (8.3.5), entonces el parámetro de plantilla es un paquete de parámetros de plantilla (14.5.3). Un paquete de parámetros de plantilla que es una declaración de parámetro cuyo tipo contiene uno o más paquetes de parámetros no expandidos es una expansión de paquete.

Como DEF toma un paquete de parámetros sin tipo, no coincide con un parámetro de plantilla de plantilla que no toma paquetes ([temp.arg.template] / p3):

Un argumento de plantilla coincide con un parámetro de plantilla de plantilla P cuando cada uno de los parámetros de plantilla en la lista de parámetros de plantilla de la plantilla de clase correspondiente o la plantilla de alias A coincide con el parámetro de plantilla correspondiente en la lista de parámetros de plantilla de P. Dos parámetros de plantilla coinciden si son del mismo tipo (tipo, no-tipo, plantilla), para los parámetros-plantilla no tipo s, sus tipos son equivalentes (14.5.6.1), y para el parámetro- plantilla plantilla , cada uno de sus parámetros de plantilla correspondientes coincide, recursivamente. Cuando la lista de parámetros de plantilla de P contiene un paquete de parámetros de plantilla (14.5.3), el paquete de parámetros de plantilla coincidirá con cero o más parámetros de plantilla o paquetes de parámetros de plantilla en la lista de parámetros de plantilla de A con el mismo tipo y forma que el paquete de parámetros de plantilla en P (ignorando si esos parámetros de plantilla son paquetes de parámetros de plantilla).

Para estar seguro, los Values son bastante extraños para los paquetes: para cada especialización de ABC , los Values deben contener un número fijo de argumentos, pero según las reglas actuales sigue siendo un paquete, por lo que se aplican las reglas para los paquetes.