繁体   English   中英

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

[英]Convert type of std::tuple to std::pair

Boost文档向我们展示了如何实现类型转换器

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
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结构模板的部分mp_rename_impl化。

然后编译器使用部分排序规则 即:

当实例化类模板,并且存在可用的部分特化时,编译器必须决定是使用主模板还是使用其部分特化。

1) 如果只有一个特化与模板参数匹配,则使用该特化

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

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

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

编译器将A<T...>std::pair<int, double>Bstd::tuple并推导出相应的类型: A作为std::pairB作为std::tupleT... as int, double

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM