Meta-Function获取模板列表的第一个模板

时间:2017-12-12 15:21:13

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

使用以下元函数front来获取第一种类型的类型列表,我尝试编写一个类似的元函数来提取模板列表的第一个模板。

namescpace detail {
    template<typename L> struct front_impl;
    template<template<typename, typename...> typename L, typename F, typename... I>
    struct front_impl<L<F, I...>> {
        typedef F type;  
    };
}
template<typename L> struct front_impl;
template<template<typename, typename...> typename L, typename F, typename... I>
struct front_impl<L<F, I...>> {
    typedef F type;  
};

可以使用如下:

template<typename... T>
struct List {
    inline static constexpr size_t size = sizeof...(T);
};

using l1 = List<A, B, C>;
using f1 = front<l1>;

现在我尝试对模板列表做同样的事情。因此,我使用了一系列模板TList

template<template<typename> typename... TT>
struct TList {
    inline static constexpr size_t size = sizeof...(TT);
};

和元函数tfront

template<typename T> struct tfront;
template<template<typename> typename F, template<typename> typename... R>
struct tfront<TList<F, R...>> {
    template<typename T> using type = F<T>;
};

然后我可以提取模板列表中的第一个AB,...(此处未显示):

    using tlist = TList<A, B, C>;

    template<typename T>
    using f = typename tfront<tlist>::template type<T>;

    f<int> xx;

然后xx类型为A<int>

问题是:我可以像tfront一样编写元函数front,这不是模板列表的部分特化{{1对于模板的每个可变参数模板,?所以我想为TList引入一个参数L作为带有可变参数模板列表的template-template-parameter,这样编译器也必须推导出tfront类型的类型与L的情况一样。

我想写一些像(但是用什么作为???):

front

1 个答案:

答案 0 :(得分:3)

您需要额外的template<typename> typename...

template<typename>
struct tfront;

template<template<typename> typename F, 
         template<template<typename> typename...> typename TL, 
         template<typename> typename... R>
struct tfront<TL<F, R...>> 
{
};

live example on wandbox

相关问题