在标准库中有个模板函数:std::decay可以退化类型,但退化的并不完全,如const int**[]或者const int* const类型都无法做到完全退化。这里使用模板类型的递归实现:

{{EJS0}}

因为该类型不是用于实例化,type是编译期的类型的别名,所以不用担心继承问题,继承只是为了方便访问基类type。

如使用fulldecay<const int* const>::type时,会根据偏特化自动匹配:

如第一层递归时,把const int*看作为T然后去适配const T的偏特化,之后把T再次递归基类进入第二层递归;

第二层递归将const int看作T适配T*的偏特化;

第三层递归将int看作T适配const T的偏特化;

第四层递归将int看作T适配T的模板,得到type类型。