C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板。模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
一.函数模板
1.定义:
template <typename T1, typename T2...>
函数返回类型 函数名 (参数表){...}
例:
template <typename T> T my_min(T a, T b) { return (a < b) ? a : b; }
a. 模板的声明要与函数模板的定义紧挨
2.模板函数
在调用模板时,必须为它的类型参数提供实际的数据类型,编译器将利用该类型替代模板中的全部类型参数,自动生成代码,这个过程称之为模板的实例化。实例化生成的函数就是模板函数
3.模板参数
3.1.实例化过程不会进行隐式的类型转化,可以显式指定类型参数的类型
my_min<double>(0.1,2)
3.2.参数可以为非类型参数,并且只能向其传递常数,不能传递变量(见例2)
二.类模板
与函数模板相似直接上例子
例3:
//Stack类模板
//Stack.h
#ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED using namespace std; template<typename T, int MAXSIZE> class Stack{ private: T elems[MAXSIZE + 1]; int n; // 元素个数 public: Stack(){n = 0;} void push(T e) { if(n == MAXSIZE) { cout << "栈已满,加入失败"<<endl; return; } elems[++n] = e; } void pop() { if(n == 0) { cout << "栈已清空"<<endl; return ; } n--; } T top() { if(n == 0) { cout << "栈已清空" <<endl; return 0; } return elems[n]; } }; #endif // STACK_H_INCLUDED
#include <iostream> #include "Stack.h" using namespace std; int main() { Stack<int,10> istack; for(int i = 0; i < 10; i ++ ) istack.push(i); cout << istack.top() << endl; for(int i = 0; i < 9;i ++ ) istack.pop(); cout << istack.top() << endl; istack.pop(); }
例1:
//最小值函数的模板
#include <iostream> using namespace std; template <typename T> T my_min(T a, T b) { return (a < b) ? a : b; } template <typename T1, typename T2> T1 my_max(T1 a, T2 b) { return (a < b ) ? a : b; } int main() { cout << my_min(1,2) << endl; cout << my_min('b','a') << endl; cout << my_min(1.0,0.1) << endl; cout << my_min<double>(0.1,2) << endl; cout << my_max(1.3, 1) << endl; return 0; }
例2:
//排序函数模板
include <iostream> using namespace std; template <typename T, int n> T my_sort(T a[n]) { for(int i = 0; i < n - 1; i ++) { for(int j = 0; j < n - 1 - i; j ++) { if(a[j] > a[j + 1]) { T t = a[j + 1]; a[j + 1] = a[j]; a[j] = t; } } } } int main() { int a[] = {2,3,4,5,10,1,0}; my_sort<int,7>(a); cout <<a[0]<<endl; return 0; }
标签:函数,int,template,my,Stack,模板 From: https://www.cnblogs.com/qlc23333/p/17428795.html