为了更好地理解C++中的模板和元编程,我正在阅读这篇文章,但是我对代码片段的理解很快就降低了,例如:
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<std::pair<int, float>, std::tuple> // -> std::tuple<int, float>
mp_rename<mp_list<int, float>, std::pair> // -> std::pair<int, float>
mp_rename<std::shared_ptr<int>, std::unique_ptr> // -> std::unique_ptr<int>
有人能否像我这样五岁的孩子一样解释一下代码呢?我对非模板化的C++有一个普通和基本的理解。
我不明白的是:
为什么
mp_rename_impl
使用两个类型参数(class A,template<class...> class B
)进行前向声明,然后在同一时间[*]用三个类型参数(template<class...> class A, class... T, template<class...> class B
)和两个(A<T...>, B
)分别定义和特化?我知道它将
type
别名(using type = B<T...>;
)为B<T...>
而不是A<T...>
,但我真的不明白它是如何完成的。还有为什么
A
只在特化中作为模板模板参数?[*] 我肯定这里理解错了。