【问题标题】:Convert type of std::tuple to std::pair将 std::tuple 的类型转换为 std::pair
【发布时间】:2018-01-05 11:17:23
【问题描述】:

Boost document 告诉我们如何实现类型转换器

template<class A, template<class...> class B> struct mp_rename_impl;

template<template<class...> class A, class... T, template<class...> class B>
    struct mp_rename_impl<A<T...>, B>
{
    using type = B<T...>;
};

template<class A, template<class...> class B>
    using mp_rename = typename mp_rename_impl<A, B>::type;

这个mp_rename的作用是将A型转换为B型。

例子:

mp_rename<std::pair<int, double>, std::tuple>

等于

std::tuple<int, double>

据我所知

mp_rename<std::pair<int, double>, std::tuple>

打电话

template<class A, template<class...> class B> struct mp_rename_impl;

然后转发到

template<template<class...> class A, class... T, template<class...> class B> struct mp_rename_impl<A<T...>, B>    

我的问题是,为什么编译器知道它应该转发给

template<template<class...> class A, class... T, template<class...> class B> struct mp_rename_impl<A<T...>, B>

并将 A 类拆分为

template<class...> class A, class... T

【问题讨论】:

    标签: c++ c++11 boost


    【解决方案1】:
    template<class A, template<class...> class B> struct mp_rename_impl;
    
    template<template<class...> class A, class... T, template<class...> class B>
        struct mp_rename_impl<A<T...>, B>
    {
        using type = B<T...>;
    };
    

    这里的mp_rename_impl&lt;A&lt;T...&gt;, B&gt;mp_rename_impl 结构模板的部分特化。

    然后编译器使用partial ordering rules。即:

    当一个类模板被实例化时,有部分 可用的专业化,编译器必须决定是否主要 将使用模板或其部分特化之一。

    1) 如果只有一个特化匹配模板参数,那 使用专业化

    2) 如果多个特化匹配,偏序规则是 用于确定哪个专业更专业。最多 如果它是唯一的(如果不是 唯一的,程序无法编译)

    3) 如果没有匹配的特化,则使用主模板

    因为你只有一个特化 mp_rename_impl&lt;A&lt;T...&gt;, B&gt; 并且它匹配模板参数然后它被编译器拾取。

    编译器将A&lt;T...&gt;std::pair&lt;int, double&gt;Bstd::tuple 进行比较,并推断出相应的类型:Astd::pairBstd::tuple 和@9876543334@ 为@9876。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-31
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2022-01-11
      • 2012-05-23
      • 2019-06-15
      相关资源
      最近更新 更多