在CSDN上看了这样一篇文章
“CSDN_递归之美 - Loki库TypeList源码剖析”
中间提到TypeList类的实现,我觉得讲得特别好,但是有几点不懂,希望哪位大侠讲解。 //TypeAT的实现 - 获取给定位置处的元素

//仅有声明,没有实现,如果所传入的类型不是TypeLsit的话,会产生一个编译期错误
        template <class TList, unsigned int index> struct TypeAt;
        
        template <class Head, class Tail>
        
        struct TypeAt<Typelist<Head, Tail>, 0>
        // 递归调用的结束条件,如果给定位置为0,则返回TypeList中的第一个元素        {
            typedef Head Result;
        };        template <class Head, class Tail, unsigned int i>
//递归规则定义,注意这里的返回结果为类型,        struct TypeAt<Typelist<Head, Tail>, i>
        // 运用了类型萃取技术。typename关键字的作用是告诉编译器其后的实体是类型。
        {
            typedef typename TypeAt<Tail, i - 1>::Result Result;
        };
注释是原文作者加的。 
       
问题
1)看不懂这句话的语法template <class TList, unsigned int index> struct TypeAt;
呵呵,我的C++书上讲template讲得很简单,哪位给我解释一下。
(特别是后面跟着struct TypeAt是什么意思,TypeAt不是一个函数吗?)2)       struct TypeAt<Typelist<Head, Tail>, 0>
        // 递归调用的结束条件,如果给定位置为0,则返回TypeList中的第一个元素        {
            typedef Head Result;
        };
这里开头的struct是说TypeAt会返回一个struct,直接返回Head就可以了,但是这里为什么要使用typedef?3)还有这一句typedef typename TypeAt<Tail, i - 1>::Result Result;
作者的解释“typename关键字的作用是告诉编译器其后的实体是类型。”
不过还是看不懂这句。我去查了很多C++的书都没有找到以上几个问题的解释,
希望哪位大侠给我一个详细一点的解释,谢谢!