函数模板
1 2 3 4
| template <typename type> ret-type func-name(parameter list) { }
|
以数组求和的函数为例,一般我们在对整型数组求和时,以下为一个常见的求和函数:
1 2 3 4 5 6 7 8 9
| int sum (int *begin, int*end) { int ans = 0; for(int* p = begin;p!=end;p++) { ans += *p; } return ans; }
|
若想对sum函数进行改造,使其可以对于任意一个类型的数组进行求和,就需要使用模板。
使用模板改造sum函数如下:
1 2 3 4 5 6 7 8 9 10 11
| template <typename T> T sum (T *begin, T *end) { T ans = 0; for(T* p = begin;p != end;p++) { ans += *p; } return ans; } 注意:当类型为自定义结构体或类时,应该先定义结构体`+` ,`-`等操作。
|
结构体模板
1 2 3 4
| template <typename type> struct <_name> { }
|
同样,我们以一个例子来看一下,我们自定义一个Point结构体:
1 2 3 4 5
| template <typename T> struct Point{ T x,y; Point(T x=0,T y=0):x(x),y(y){} };
|
Point结构体的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<iostream> using namespace std; template <typename T> T sum (T *begin, T *end) { T ans = 0; for(T* p = begin;p != end;p++) { ans =ans + *p; } return ans; } template <typename T> struct Point{ T x,y; Point(T x=0,T y=0):x(x),y(y){} }; template <typename T> Point<T> operator + (Point<T> A,Point<T> B){ return Point(A.x+B.x,A.y+B.y); }
template <typename T> ostream& operator << (ostream &out,Point<T> p){ out<<"("<<p.x<<","<<p.y<<")"; return out; } int main() { Point<int> a(1,1); Point<int> b(2,2); Point<double> c(2.4,2.5); Point<double> d(2.3,2.4); cout<<(a+b)<< (c+d) <<endl; return 0; }
|