C++学习——系列六
模板
字面意思,做一个函数或类的模板,根据实际调用情况来实例化函数或类。
template <class 类型参数1, class 类型参数2...>
返回值类型 函数名(形参表)
{
函数体;
}
template <class 类型参数1, class 类型参数2...>
class 类名
{
...
};
template <class T, int size> //也可出现非类型参数
class A
{
T array[size];
};
A<double, 5> a;
#include <iostream>
#include <string>
using namespace std;
//循环执行函数
template <class T, class Pred>
void MyForeach (T * s, T * e, Pred f) //可以传入函数指针
{
for(; s != e; ++s)
{
f(* s);
}
}
void Print(string s)
{
cout << s << endl;
}
//模板类
template <class T>
class myclass
{
public:
T * p;
int size;
myclass(T * m, int n)
{
p = new T[n];
size = n;
for(int i = 0; i < size; ++i)
p[i] = m[i];
}
~myclass( )
{
delete [] p;
}
};
int main() {
string array[3] = {"abc", "def", "ghi"};
MyForeach(array,array+3,Print); //编译器自动实例化函数
myclass<string> obj(array,3); //编译器自动实例化类
cout << obj.p[2];
return 0;
}
note
- 函数模板可以重载,只要他们的形参表或类型参数表不同;
- 调用函数时,编译器先找参数匹配的普通函数,再找参数匹配的模板函数,最后找参数自动类型转换后匹配的普通函数;
- 模板类是类模板实例化后的一个产物;
- 模板类中有静态成员,其实例化后的类公用一个静态成员;