2012-03-12 12 views
16

Actualmente estoy luchando con el siguiente código, cuya intención es implementar modelo modelos variadic variadic:variadic modelo modelos variadic

template 
< 
    template <typename... HeadArgs> class Head, 
    template <typename... TailArgs> class... 
> 
struct join<Head<typename HeadArgs...>, Head<typename TailArgs...>...> 
{ 
    typedef Head<typename HeadArgs..., typename TailArgs......> result; 
}; 

Idealmente, me gustaría ser capaz de utilizar esta plantilla para lograr metafunción la siguiente:

template <typename...> struct obj1 {}; 
template <typename...> struct obj2 {}; 

typedef join 
< 
    obj1<int, int, double>, 
    obj1<double, char>, 
    obj1<char*, int, double, const char*> 
>::result new_obj1; 

typedef join 
< 
    obj2<int, int, double>, 
    obj2<double, char>, 
    obj2<char*, int, double, const char*> 
>::result new_obj2; 

/* This should result in an error, because there are 
    different encapsulating objects 
typedef join 
< 
    obj1<int, int, double>, 
    obj1<double, char>, 
    obj2<char*, int, double, const char*> 
>::result new_obj; 
*/ 

la salida de los anteriores sería de esperar crear new_obj1 y new_obj2 en forma template<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {};

Estoy usando gcc 4.6.2 en Windows, que genera un "paquete de parámetros esperado antes de '...'" para la expansión de "Head<typename TailArgs...> ...".

This error is reproducable with gcc 4.5.1.

+0

El argumento * Nombre * dentro de la 'template' especificación del parámetro de plantilla plantilla es opcional y totalmente cosmética; en realidad no está disponible como un parámetro real. –

+0

@KerrekSB ¿hay alguna forma de obtener los parámetros de un parámetro de plantilla de plantilla? – kmore

+0

Edité mi publicación; Me faltaba el caso variódico. En respuesta a su pregunta: Sí, proporcionando un parámetro de plantilla explícito (paquete) y coincidencia. –

Respuesta

18

intentar algo como esto:

template <typename...> struct join; 

template <template <typename...> class Tpl, 
      typename ...Args1, 
      typename ...Args2> 
struct join<Tpl<Args1...>, Tpl<Args2...>> 
{ 
    typedef Tpl<Args1..., Args2...> type; 
}; 

template <template <typename...> class Tpl, 
      typename ...Args1, 
      typename ...Args2, 
      typename ...Tail> 
struct join<Tpl<Args1...>, Tpl<Args2...>, Tail...> 
{ 
    typedef typename join<Tpl<Args1..., Args2...>, Tail...>::type type; 
}; 
+0

Esa es una solución perfecta cuando se combinan los parámetros de dos objetos. Sin embargo, estoy buscando combinar los parámetros de una cantidad variable de objetos. Intenté [modificar] (http://ideone.com/njBuE) tu respuesta, pero todavía hay un error con el paquete de expansión. ** EDIT: me ganaste, gracias! ** – kmore

Cuestiones relacionadas