2012-03-12 81 views
16

Jestem obecnie zmaga się z poniższym kodzie, którego intencją jest wprowadzenie zmiennej liczbie argumentów o zmiennej liczbie argumentów szablony Szablon:o zmiennej liczbie argumentów szablony o zmiennej liczbie argumentów szablonu

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; 
}; 

Idealnie, chciałbym być w stanie korzystać z tego szablonu metafunkcji osiągnąć następujący:

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; 
*/ 

wyjście z powyżej, z nadzieją tworzyć new_obj1 i new_obj2 w postaci template<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {};

Używam gcc 4.6.2 w systemie Windows, który wyświetla "oczekiwany pakiet parametrów przed" ... "" dla rozwinięcia "Head<typename TailArgs...> ...".

This error is reproducable with gcc 4.5.1.

+0

Argument * nazwa * wewnątrz 'template' specyfikacja argumentu szablon szablon jest całkowicie opcjonalne i kosmetycznych; tak naprawdę nie jest dostępny jako prawdziwy parametr. –

+0

@KerrekSB jest jakiś sposób, aby uzyskać parametry parametru szablonu szablonu? – kmore

+0

Edytowałem mój post; Brakowało mi przypadku variadic. W odpowiedzi na twoje pytanie: Tak, przez podanie jawnego parametru szablonu (pakietu) i dopasowania. –

Odpowiedz

18

spróbować czegoś takiego:

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

To idealne rozwiązanie przy łączeniu parametrów dwóch obiektów. Jednakże, chcę połączyć parametry zmiennej liczby obiektów. Próbowałem [modyfikowanie] (http://ideone.com/njBuE) Twojej odpowiedzi, ale nadal występuje błąd w pakiecie rozszerzeń. ** EDIT: pokonałeś mnie, dziękuję! ** – kmore

Powiązane problemy