目录
  • 一.泛型编程
  • 二.函数模板
    • 1.函数模板概念
    • 2.函数模板格式
    • 3.函数模板的原理
  • 三.类模板

    一.泛型编程

    泛型编程:不再是针对某种类型,能适应广泛的类型,跟具体的类型无关的代码

    如何实现一个通用的交换函数呢?

    void Swap(int& left, int& right)
    {
    	int temp = left;
    	left = right;
    	right = temp;
    }
    void Swap(double& left, double& right)
    {
    	double temp = left;
    	left = right;
    	right = temp;
    }

    使用函数重载虽然可以实现,但是有一下几个不好的地方: 1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增 加对应的函数 2. 代码的可维护性比较低,一个出错可能所有的重载均出错

    因此我们需要告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码

    二.函数模板

    C++深入了解模板的使用

    模板分为:函数模板,类模板

    1.函数模板概念

    函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本。

    2.函数模板格式

    template<typename T>

    返回值类型 函数名(参数列表){}

    说明:

    1.template<class T> 和 template<typename T>在此暂时认为一样,template<struct T>是 错误的 ,没有这种写法

    2.T是type的缩写,T不一定写T,可以写任意字母,比如X,t ……但是习惯写为T

    举例:

    template<typename T>    //或template<class T>
    void Swap(T& left, T& right)
    {
    	T tmp = left;
    	left = right;
    	right = tmp;
    }
    int main()
    {
    	int a = 0, b = 1;
    	double c = 2.2, d = 3.3;
    	swap(a, b);
    	swap(c, d);
    	return 0;
    }

    swap(a, b);swap(c, d); 调用的是同一个函数吗?

    答:不是同一个。底层汇编可以看出不是同一个,如果调试时发现走的是同一个函数,其实是编译器的优化导致。

    C++深入了解模板的使用

    实际上以后swap函数都不用自己写了,库中有模板,直接用就行

    C++深入了解模板的使用

    3.函数模板的原理

    在编译器编译阶段 ,对于模板函数的使用, 编译器需要根据传入的实参类型来推演生成对应类型 的函数 以供调用。比如: 当用 double 类型使用函数模板时,编译器通过对实参类型的推演,将 T 确定为 double 类型,然后产生一份专门处理 double 类型的代码 ,对于字符类型也是如此。 模板的实例化:

    C++深入了解模板的使用

    三.类模板

    类模板的定义格式

    template < class T1 , class T2 , …, class Tn >

    class 类模板名

    {

    // 类内成员定义

    };

    举例:调用 Stack<int> st1; 时,用int替换模板中的T。调用 Stack<double> st1; 时,用double替换模板中的T

    // 类模板
    template<class T>
    class Stack
    {
    public:
    	Stack(int capacity = 0)
    	{
    		_a = new T[capacity];
    		_capacity = capacity;
    		_top = 0;
    	}
    	~Stack()
    	{
    		cout << "~Stack()" << endl;
    		delete[] _a;
    		_capacity = 0;
    		_top = 0;
    	}
    	void Push(const T& x)
    	{}
    private:
    	T* _a;
    	int _top;
    	int _capacity;
    };
    int main()
    {
    	Stack<int> st1; // int
    	st1.Push(1);
    	Stack<double> st2; // double
    	st2.Push(2.2);
    	return 0;
    }
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。