嵌入式linux C++语言(九)——模板
泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意。 泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。
泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。
一、函数模板
1、函数重载实现的泛型
#include <iostream> using namespace std; void swap(int &a, int& b) { int t = a; a = b; b = t; } void swap(double &a,double b) { double t = a; a = b; b = t; } int main() { int ia = 10; int ib = 20; swap(ia,ib); cout<<ia<<ib<<endl; double da = 10, db = 20; swap(da,db); cout<<da<<db<<endl; return 0; }
2、函数模板
语法格式
template<typename/class 类型参数表>
返回类型 函数模板名(函数参数列表)
{
函数模板定义体
}
3、函数模板实例
#include <iostream> using namespace std; template <typename T> void Swap(T& a,T &b ) { T t = a; a = b; b = t; } int main() { int ia = 10; int ib = 20; Swap(ia,ib); //Swap<int>(ia,ib); cout<<ia<<ib<<endl; double da = 10, db = 20; Swap(da,db); //Swap<double>(da,db); cout<<da<<db<<endl; string sa ="china"; string sb = "America"; Swap(sa,sb); cout<<sa<<sb<<endl; return 0; }
函数模板,只适用于函数的参数个数相同而类型不同,且函数体相同的情况。如果个数不同,则不能用函数模板。
二、类模板
1、类模板的定义
类模板的定义
template<typename T>
class Stack
{ }
类内定义成员函数
template<typename T>
class Stack
{
public:
Stack(int size)
{
space = new T[size];
top = 0;
}
}
类外定义函数
template<typename T>
void Stack<T>::push(T data)
{
space[top++] = data;
}
类模板实例化为模板类
Stack<double> s(100);
类模板是类的抽象,类是类模板的实例。
2、类模板实例
#include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> using namespace std; template<typename T> class Stack { public: Stack(int size) { space = new T[size]; top = 0; } ~Stack(); bool isEmpty(); bool isFull(); void push(T data); T pop(); private: T* space; int top; }; template<typename T> Stack<T>::~Stack() { delete []space; } template<typename T> bool Stack<T>::isEmpty() { return top == 0; } template<typename T> bool Stack<T>::isFull() { return top == 1024; } template<typename T> void Stack<T>::push(T data) { space[top++] = data; } template<typename T> T Stack<T>::pop() { return space[--top]; } int main() { Stack<double> s(100); //Stack<string> s(100); if(!s.isFull()) s.push(10.3); if(!s.isFull()) s.push(20); if(!s.isFull()) s.push(30); if(!s.isFull()) s.push(40); if(!s.isFull()) s.push(50); while(!s.isEmpty()) cout<<s.pop()<<endl; return 0; }
时间: 2024-08-08 12:02:41