1.c++支持的2种泛型和变化
a. 类模板
全局特化和局部特化
模板实参是显示指定的
template <typename T,typename T2>
class stack{
};
template <>
class stack<int>
{
};
template <typename T>
class stack<T,T>
{
};
stack<double,int>//类型 s1;
b. 函数模板
指定模板调用,模板参数演绎和显示指定
template <typename T>
T max(T const & , T const& );
max<int>(3,4);
max<>(3,4);
c.变形:
成员函数模板
嵌套类模板
成员函数模板:
template <typename conf>
void print();
template <typename T>
template <typename conf>
void stack<T>::print();
stack<int> a;
a.print<double>();
非类型模板参数
模板参数可以做模板实参
默认模板参数(在gcc 上 只有类模板能有默认模板参数,函数模板不能有默认参数)
template <typename T,typename T2=T,T size=T()>
class stack1
{
private:
public:
template <typename T3> void print();
};
成员函数模板不能为虚函数
类模板非模板成员函数可以为虚函数
2.模板参数
a.类型参数
b.非类型参数(只能是常整形,指针类型(对象指针,函数指针,类成员的指针),引用类型(对象的引用,函数的引用))
c.模板的模板参数(只能是类类型)
typename T: 如果 T 后面用不到,则 可省略T
而 T 在后面使用中就不能加 class 修饰(class 和 typename 基本是等价的)
所以在 模板中使用
friend class T; //错误
模板的模板参数
需要注意的是概念
模板参数 是 模板,而不包含模板的参数
exp.
template <template <typename T> class conf>
void test()
{
conf<T> a;//错误,T 在这里是不可见的
conf<int> b;//ok
}
test<stack>();//ok
T 只是占位符号
作用域 只在模板之中,只能用在自身之中
template <typename T, template <typename T1=T, T1* > class conf >
class stack
{
};
以上为 gcc 4.4.1 编译通过!!