变分变分模板

Variadic variadic template templates

本文关键字:      更新时间:2023-10-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;
*/

以上的输出将有望以template<int, int, double, double, char, char*, int, double, const char*> struct new_obj[1|2] {}; 的形式创建new_obj1new_obj2

我在Windows上使用的是gcc 4.6.2,它输出一个"‘…’之前的预期参数包",用于扩展"Head<typename TailArgs...>…"。

此错误可在gcc 4.5.1中重现。

试试这样的东西:

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;
};
相关文章:
  • 没有找到相关文章