【问题标题】:Meta-Function to get the first template of a list of templates获取模板列表的第一个模板的元函数
【发布时间】:2017-12-12 23:36:51
【问题描述】:

使用以下元函数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&lt;int&gt;

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

我想写一些类似的东西(但是用作什么???):

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

【问题讨论】:

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


    【解决方案1】:

    你需要多一层template&lt;typename&gt; 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

    【讨论】:

    • 超级!是否可以将front 元函数用于类型列表和tfront 用于模板列表overload:我的意思是我可以为模板列表添加front 的额外专业化吗?我认为这里有概念?
    猜你喜欢
    • 2011-05-16
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多