元功能处理模板列表

时间:2017-12-13 07:56:42

标签: c++ variadic-templates c++17 template-meta-programming

问题Meta-Function to get the first template of a list of templates @ vittorio-romeo给出了编写元函数的答案,以获取模板列表的第一个模板。现在我想编写一个元函数,它接受一个模板(作为一个元函数)和一个要处理的模板列表:

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吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

  

我的问题仍然是,我们必须在/ primary / template中只编写typename TL吗?

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

部分特化通过类型推导声明一组新的模板参数与主要模板参数匹配;很明显,他们的种类必须匹配。

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