2012-03-12 1 views
16

Я в настоящее время борется со следующим кодом, целью которого является реализация VARIADIC VARIADIC шаблона:VARIADIC шаблоны 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; 
}; 

В идеале, я бы иметь возможность использовать этот шаблон metafunction для достижения следующее:

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

выход выше, мы надеемся создать new_obj1 и new_obj2 в виде template<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {};

Я использую gcc 4.6.2 в Windows, который выводит «ожидаемый пакет параметров до« ... »для расширения« Head<typename TailArgs...> ... ».

This error is reproducable with gcc 4.5.1.

+0

Аргумент * имя * внутри 'template' спецификация шаблона шаблон аргумент является необязательным и полностью косметическим; он фактически не доступен как реальный параметр. –

+0

@KerrekSB есть ли способ получить параметры шаблона шаблона? – kmore

+0

Я отредактировал мой пост; Мне не хватало вариационного случая. В ответ на ваш вопрос: Да, предоставив явный шаблонный параметр (пакет) и соответствие. –

ответ

18

попробовать что-то вроде этого:

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

Это идеальное решение при объединении параметров двух объектов. Тем не менее, я ищу, чтобы объединить параметры переменного количества объектов. Я попробовал [изменить] (http://ideone.com/njBuE) ваш ответ, но в пакете расширения все еще есть ошибка. ** РЕДАКТОР: вы избили меня, спасибо! ** – kmore

 Смежные вопросы

  • Нет связанных вопросов^_^