模板参数的问题:
对于模板参数的使用可以分为三大类:
1.类型参数;
2.非类型参数;
3.模板的模板参数;
针对于类型参数:
其实就是我们所最常使用的类类型,通常在模板参数列表中需要typenmae进行声明,往往是一个类或者某种类型;
可以说是最常见的一种;
针对于非类型参数:
之前提到过,例如典型的内置类型就是我们所需要的非类型参数;
通常来说,非类型参数往往有以下几种:
1.整型或者枚举类型;
2.指针类型:函数指针、普通对象指针、指向成员的指针;
3.引用类型:指向对象和函数的引用;
其中值得注意的是,对于非类型参数,我们常见的int是不需要在模板参数列表中加入typename,但是有一些依赖型函数则需要,这个要视情况而定,后面书中第九章会讲到这个;
当然函数和数组类型也可以当成非类型参数,但是其实是编译器和环境通过隐式转化而构成,这个需要注意一下;
针对于模板的模板参数:
个人认为这是一种很华而不实的东西,看了这么多例子也觉得很操蛋,完全可以分开写;
但是后来细细品了品,发现其实是在为不同的类内初始化做准备;
不妨考虑之前的那个模板的模板参数形式:
template <typename T, template<typename U,typename =std::allocator<U>> class CONT = vector > class A { private: CONT<T,list<int>> A; };
其中第二个参数模板给定了一个缺省参数模板CONT,其中CONT拥有两大初始化类型,U以及用于分配空间的allocator,其中allocator也采用U进行初始化;
多以可以大致看出,第二个参数模板主要是针对于匹配vector、map、list等STL的的类型,所以其实也是为了已知的类型服务;
所以模板的模板参数个人认为主要是为特殊的类定制化服务,而不是像普通模板进行内置或者函数类型、简单模板类类型传参;