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
答案 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>
和B
与std::tuple
进行比较,并推导出相应的类型:A
为std::pair
,{{1} } B
和std::tuple
为T...
。