C++ 基础 6:模板

1 函数模板

泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意。

泛型编程 的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。 泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数 T。

所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为 函数模板

1.1 函数模板的引入

语法格式如下:

template <typename T>
返回类型 函数模板名(函数参数列表)
{
      函数模板定义体
}

template 是语义是模板的意思,尖括号中先写关键字 typename 或是 class,后面跟一个类型 T,此类即是虚拟的类型。至于为什么用 T,用的人多了,也就是 T 了。

1.2 函数模板的实例

// funcTemplate.cpp,函数模板

#include <iostream>

using namespace std;

template <typename T>
void mySwap(T &a, T &b)
{
	T t = a;
	a = b;
	b = t;
}

int main()
{
	int x = 1;
	int y = 2;

	mySwap(x,y);
	cout << "x:" << x << ",y:" << y << endl;

	mySwap<int>(x,y);
	cout << "x:" << x << ",y:" << y << endl;

	char a = 'a';
	char b = 'b';

	mySwap(a,b);
	cout << "a:" << a << ",b:" << b << endl;

	mySwap<char>(a,b);
	cout << "a:" << a << ",b:" << b << endl;

	return 0;
}

运行结果:

函数模板,只适合函数的参数个数相同而类型不同,且函数体相同的情况。如果个数不同,则不能用函数模板。

2 类模板

2.1 类模板定义

类模板与函数模板的定义和使用类似,我们已经进行了介绍。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,所以将类中的类型进行泛化。

语法格式如下:

template <typename T>
class 类名
{
   
}

2.2 类模板的实例

下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
 
using namespace std;
 
template <class T>
class Stack { 
  private: 
    vector<T> elems;          // 元素 
 
  public: 
    void push(T const&);      // 入栈
    void pop();               // 出栈
    T top() const;            // 返回栈顶元素
    bool empty() const{       // 如果为空则返回真。
        return elems.empty(); 
    } 
}; 
 
template <class T>
void Stack<T>::push (T const& elem) 
{ 
    // 追加传入元素的副本
    elems.push_back(elem);    
} 
 
template <class T>
void Stack<T>::pop () 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::pop(): empty stack"); 
    }
    // 删除最后一个元素
    elems.pop_back();         
} 
 
template <class T>
T Stack<T>::top () const 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::top(): empty stack"); 
    }
    // 返回最后一个元素的副本 
    return elems.back();      
} 
 
int main() 
{ 
    try { 
        Stack<int>         intStack;  // int 类型的栈 
        Stack<string> stringStack;    // string 类型的栈 
 
        // 操作 int 类型的栈 
        intStack.push(7); 
        cout << intStack.top() <<endl; 
 
        // 操作 string 类型的栈 
        stringStack.push("hello"); 
        cout << stringStack.top() << std::endl; 
        stringStack.pop(); 
        stringStack.pop(); 
    } 
    catch (exception const& ex) { 
        cerr << "Exception: " << ex.what() <<endl; 
        return -1;
    } 
}

当上面的代码被编译和执行时,它会产生下列结果:

7
hello
Exception: Stack<>::pop(): empty stack
原文地址:https://www.cnblogs.com/PikapBai/p/13263467.html