将std :: tuple的类型转换为std :: pair

时间:2018-01-05 11:17:23

标签: c++ c++11 boost

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

1 个答案:

答案 0 :(得分:3)

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<A<T...>, B>mp_rename_impl结构模板的部分特化。

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

  

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

     

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

     

2)如果多个专业化匹配,则部分订单规则为   用于确定哪种专业化更专业化。最多   如果它是唯一的(如果不是),则使用专门的专业化   独特,程序无法编译)

     

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

由于您只有一个专门化mp_rename_impl<A<T...>, B>并且它与模板参数匹配,因此编译器会选择它。

编译器将A<T...>std::pair<int, double>Bstd::tuple进行比较,并推导出相应的类型:Astd::pair,{{1} } Bstd::tupleT...