函数模板的作用:解决需要重载多种不同类型参数的函数的问题,但又不想重载的时候。
好处,泛型编程,解决了多处重载的问题。
函数模板Demo:
//声明函数模板类型T,T代表泛型,类似于OC中的id。函数模板的声明要实现放在一齐,分开的话会报错。class换成typename也是同一个意思。 template <class T> void swap(T &a,T&b) { T temp = a; a = b; b = temp; } int main(int argc, const char * argv[]) { int i1 = 100; int i2 = 200; std::cout << "交换前,i1 = " << i1 << " i2 = "<< i2 << std::endl; swap<int>(i1,i2);//调用方式一 std::cout << "交换前,i1 = " << i1 << " i2 = "<< i2 << std::endl; std::string s1 = "小甲鱼"; std::string s2 = "小鱿鱼"; std::cout << "交换前,s1 = " << s1 << ",i2 = " << s2 << std::endl; swap(s1, s2);//调用方式二 std::cout << "交换前,s1 = " << s1 << ",i2 = " << s2 << std::endl; return 0; }
控制台打印结果:
交换前,i1 = 100 i2 = 200 交换前,i1 = 200 i2 = 100 交换前,s1 = 小甲鱼,i2 = 小鱿鱼 交换前,s1 = 小鱿鱼,i2 = 小甲鱼
类模板Demo,实现栈式结构,first in last out,只有1个口。
template <class T> class Stack { public: Stack(unsigned int size = 100); ~Stack(); void push(T value); T pop(); private: unsigned int size;//数组容器data的大小 unsigned int sp;//栈的当前位置 T *data;//存储入栈的数组 }; template <class T> Stack<T>::Stack(unsigned int size) { this -> size = size; data = new T[size];//初始化一个泛型数组 sp = 0; } template<class T> Stack<T>::~Stack<T>() { delete []data; } template<class T> void Stack<T>::push(T value) { data[sp++] = value; } template<class T> T Stack<T>::pop() { return data[--sp]; } int main() { Stack<int> intStack(100); intStack.push(1); intStack.push(2); intStack.push(3); std::cout << intStack.pop() << " "; std::cout << intStack.pop() << " "; std::cout << intStack.pop() << " "; }
控制台输出结果:
3 2 1