可变参数模板模板专用化错误

variadic variadic template template specialisation error

本文关键字:错误 专用 变参 参数      更新时间:2023-10-16

我试图创建一个模板,该模板给定一组元函数和一个元函数,将此方法函数添加到提供的集合中。

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 作为类模板。我该怎么做才能编译它?

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

元函数

的示例定义和一些元函数列表:

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