可变参数可变参数模板模板特化错误

时间:2014-01-07 13:13:12

标签: c++ c++11 metaprogramming

我试图创建一个给出一组元函数和元函数的模板,将这个函数添加到提供的集合中。

template<template<template<typename...> class...> class Dest,
                  template<typename...> class FirstTpl,
                  template<typename...> class ...Tpls>
struct template_push_front
{
};

template<template<template<typename...> class...> class Dest,
                  template<typename...> class FirstTpl,
                  template<typename...> class ...Tpls>
struct template_push_front<Dest, FirstTpl, Dest<Tpls...>> : Dest<FirstTpl, Tpls...>
{
};
  • 元函数表示为可变参数模板。
  • Dest是一组现有的元函数
  • Tpls是Dest内容
  • FirstTpl是要添加到Dest
  • 的元函数

编译时出现以下错误:

type/value mismatch at argument 3 in template parameter list for ‘template<template<template<class ...> class ...<template-parameter-2-1> > class Dest, template<class ...> class FirstTpl, template<class ...> class ... Tpls> struct template_push_front’
struct template_push_front<Dest, FirstTpl, Dest<Tpls...>> : Dest<FirstTpl, Tpls...>

expected a class template, got ‘Dest<Tpls ...>’

就行了

struct template_push_front<Dest, FirstTpl, Dest<Tpls...>> : Dest<FirstTpl, Tpls...>

关于

Dest<Tpls...>

令牌

我知道编译器无法识别Dest&lt; Tpls ...&gt;作为一个类模板。我该怎么做才能编译?

1 个答案:

答案 0 :(得分:2)

猜猜我是如何使用这样的东西的,我想出了以下内容:

元功能的示例性定义和一些元功能列表:

template<class L, class R>
struct some_binary_metafunction {};

template<class T>
struct some_unary_metafunction {};

template< template<class...> class... MFs >
struct some_list_of_metafunctions {};

push_front机制:

template< class List, template<class...> class MF >
struct push_front;

template< template< template<class...> class... > class ListT,
          template<class...> class... ListEntries,
          template<class...> class MF >
struct push_front< ListT<ListEntries...>, MF >
{
    using type = ListT<MF, ListEntries...>;
};

测试用例/示例:

#include <iostream>

template<class T>
void print_type()
{
    std::cout << __PRETTY_FUNCTION__ << "\n";
}

int main()
{
    using my_list = some_list_of_metafunctions<some_binary_metafunction,
                                               some_binary_metafunction,
                                               some_unary_metafunction>;
    using result = push_front<my_list, some_unary_metafunction>::type;

    print_type<result>();
}