Pregunta

Puede una plantilla plantilla variadic ser utilizado para capturar todos los casos de un parámetro de plantilla que se pasa que es en sí mismo una plantilla?

He estado usando plantillas para producir la salida de depuración para algunos plantilla basada en métodos.En primer lugar, he creado un controlador genérico, entonces especializados por tipos nativos:

template<typename... PARAMS> struct TypeList{};

template<typename TYPE> inline void ntype(ostream &out, TypeList<TYPE>) {
    out << typeid(TYPE).name();
}

template<> inline void ntype(ostream &out, TypeList<int>) {
    out << "int";
}

...

Luego he intentado añadir una segunda plantilla de formato para la captura de los tipos de plantilla que se pasa:

template<typename ... SUB, template<typename...> class TYPE> void ntype(ostream &out, TypeList<TYPE<SUB...> >) {
    ntype(out, TypeList<typename TYPE>());
    out << '<';
    subtype(out, TypeList<SUB...>());
    out << '>';
}

Donde subtipo es un método de plantilla diseñada para recurse a través del parámetro de la lista, la aplicación de cada uno de ntype() en turno.

El problema es que cuando intento llamar a esto con algo para el efecto de:

ntype<SomeClass<int> >(out, TypeList<SomeClass<int> >());

Sólo coincide con el genérico de la primera función de la plantilla - no hay errores de compilación, pero nunca coincide con la plantilla de versión de la plantilla.Estoy seguro que es simplemente una falta de entendimiento de mi parte, pero los resultados de google parecen muy delgada en el suelo cuando se trata de un claro ejemplo de plantilla de plantillas, y aún más con respecto a variadic plantilla params.

¿Alguien puede explicar si lo que estoy intentando es incluso posible y, si es así, ¿qué estoy haciendo mal?

¿Fue útil?

Solución

Parece que yo solamente había un error tipográfico - había añadido () después de uno de mis TypeLists en una declaración de función, probablemente de copiar y pegar de una función de invocación a las 3 de la mañana, que era la causa del desajuste.

Así, en caso de que alguien se está preguntando, sí es posible, y la de arriba es una manera perfectamente aceptable para hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top