元功能处理模板列表

Metafunction to process a list of templates

本文关键字:列表 处理 功能      更新时间:2023-10-16

在有问题的元函数中获取模板列表的第一个模板 @vittorio-romeo给出了编写元函数以获取模板列表的第一个模板的答案。现在,我想编写一个接受模板(作为元功能)和要处理的模板列表的meta-funtion:

template<template<typename> typename F, 
         template<template<typename> typename...> typename TL> struct transform_T;
template<template<typename> typename F, 
         template<template<typename> typename...> typename TL,
         template<typename> typename... I>
struct transform_T<F, TL<I...>> {
};

但是这个定义不会编译:https://wandbox.org/permlink/cny2dogbaqw4evq4

编辑:下面的更改起作用。这里是一个完整的示例:

#include <cstdint>
#include <cstddef>
template<typename... T>
struct List {};
template<template<typename> typename... TT>
struct TList {};
template<template<template<typename> typename> typename F, 
         typename TL> struct transform_T;
template<template<template<typename> typename> typename F, 
         template<template<typename> typename...> typename TL,
         template<typename> typename... I>
struct transform_T<F, TL<I...>> {
    typedef List<typename F<I>::type...> type;                
};
template<typename>
struct A {};
template<typename>
struct B {};
using l1 = TList<A, B>;
template<template<typename> typename X>
struct F {
    typedef X<int> type;  
};
using l2 = typename transform_T<F, l1>::type;
l2::_; // List<A<int>, B<int>>
int main() {
}

我的问题仍然是,我们是否必须在/primary/template?

中仅写typename TL

您的主要模板定义应与专业参数匹配:

template<template<typename> typename F1,typename TL> struct transform_T;

这是否是您真正想要的,取决于您要执行的"处理"类型。

我的问题仍然是,我们是否必须在/primary/template?

中仅编写typename tl?

主模板声明给定模板名称的模板参数,也就是说,它告诉编译器某些名称是一个模板,并且其参数是您指定的类别(键入,非类型,非类型,模板模板模板参数。..)。

部分专业化声明了一组新的模板参数,该参数通过类型扣除键匹配。显然,他们的种类必须匹配。

在您的原始代码中,您将TL<I...>(即类型)传递给模板网板类(template<template<typename> typename...> typename TL)的参数。