kmo*_*ore 19 c++ metaprogramming variadic-templates c++11
我目前正在努力使用以下代码,其目的是实现可变参数可变参数模板模板:
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;
};
Run Code Online (Sandbox Code Playgroud)
理想情况下,我可以使用此模板元函数来实现以下功能:
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;
*/
Run Code Online (Sandbox Code Playgroud)
上述的输出有望创建new_obj1和new_obj2形式template<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {};
我在Windows上使用gcc 4.6.2,它为" Head<typename TailArgs...>..." 的扩展输出了"'...之前的预期参数包' ".
Ker*_* SB 21
尝试这样的事情:
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;
};
Run Code Online (Sandbox Code Playgroud)