泛型编程(Generic Programming)是一种语言机制,通过它可以实现一个标准的容器库。像类一样,泛型也是一种抽象数据类型,但是泛型不属于面向对象,它是面向对象的补充和发展。 在面向对象编程中,当算法与数据类型有关时,面向对象在对算法的抽象描述方面存在一些缺陷。 比如对栈的描述: class stack {
push(参数类型) //入栈算法
pop(参数类型) //出栈算法
} 如果把上面的伪代码看作算法描述,没问题,因为算法与参数类型无关。但是如果把它写成可编译的源代码,就必须指明是什么类型,否则是无法通过编译的。使用重载来解决这个问题,即对N种不同的参数类型写N个push和pop算法,这样是很麻烦的,代码也无法通用。 若对上面的描述进行改造如下: 首先指定一种通用类型T,不具体指明是哪一种类型。 class stack<参数模板 T> {
push(T) //入栈算法
pop(T) //出栈算法
}
这里的参数模板T相当于一个占位符,当我们实例化类stack时,T会被具体的数据类型替换掉。 若定义对象S为statc类型,在实例化S时若我们将T指定int型则: 这时候类S就成为: class S { push(int) //入栈算法 pop(int) //出栈算法 } 这时我可以称class stack<参数模板 T>是类的类,通过它可以生成具体参数类型不同的类。
1) 函数模板并不是真正的函数,它只是C++编译生成具体函数的一个模子。 2) 函数模板本身并不生成函数,实际生成的函数是替换函数模板的那个函数,比如上例中的add(sum1,sum2), 这种替换是编译期就绑定的。 3) 函数模板不是只编译一份满足多重需要,而是为每一种替换它的函数编译一份。 4) 函数模板不允许自动类型转换。 5) 函数模板不可以设置默认模板实参。比如template <typename T=0>不可以
template <typename T>
inline T const& max (T const& a, T const& b)
{
// 如果 a<b 就传回 b,否则传回 a
return a < b ? b : a;
}
max(1,1.2)
template <typename T1, typename T2>
inline T1 max (T1 const& a, T2 const& b)
{
}
max<double>(1.2,1)
template <typename T1, typename T2, typename RT> inline RT max (T1 const& a, T2 const& b);
{
}
max<int,int,double>(1,1.2)
只明确写出第一自变量,剩下的留给编译器去推导,我们要做的只是把所 有「无法被自动推导出来的自变量类型」写出来
template <typename RT, typename T1, typename T2> inline RT max (T1 const& a, T2 const& b)
{
}
max<double>(4,4.2);
参考:
https://blog.csdn.net/github_34965845/article/details/80540013