![](/img/trans.png)
[英]Forcing std::tuple to contain std::pair<fixed_type, T>
[英]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>
和B
对std::tuple
并推导出相应的类型: A
作为std::pair
, B
作为std::tuple
和T...
as int, double
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.