2012-03-12 155 views
16

我目前用下面的代码中挣扎时,其意图是为了实现可变参数可变参数模板的模板:可变参数可变参数模板模板

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

理想情况下,我可以使用这个模板元函数来实现以下情况:

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_obj1new_obj2template<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {};

我在Windows上使用gcc 4.6.2,它在“Head<typename TailArgs...>Head<typename TailArgs...> ...”的扩展之前输出“...之前的预期参数包”。

This error is reproducable with gcc 4.5.1

+0

的参数名*内部'模板模板参数的template'规范是可选的,完全是化妆品;它实际上并不是真正的参数。 – 2012-03-12 06:33:19

+0

@KerrekSB有没有办法获得模板模板参数的参数? – kmore 2012-03-12 06:43:00

+0

我编辑了我的帖子;我错过了可变的情况。回答你的问题:是的,通过提供一个明确的模板参数(包)和匹配。 – 2012-03-12 06:53:31

回答

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 2012-03-12 06:54:13