小言_互联网的博客

C++函数模板template用法

223人阅读  评论(0)

函数模板template用法

sort,swap都是函数模板,并且调用时省略了<类型>
C++reference的函数大部分采用了模板形式
另外template 或 template 一般没什么区别

swap function template:

template <class T> 
void swap( T& x, T& y) {
    T temp = x;
    x = y;
    y = temp;
}


int i = 3, j = 4;
swap(i, j); 

float k = 4.5, m = 3.7;
swap(k, m);

string s("hello"), t("Hello");
swap(s, t);

不同的参数虽然可以用多个重载的函数来实现,但未免太麻烦,如果有50种参数,就需要引入temple模板来简化代码


int add(int x, int y) {
	return x + y;
}

double add(double x, double y) {
	return x + y;
}

Coor2D add(Coor2D x, Coor2D y) {  // 自己编写的类需要重载加法运算符
	return x + y;
}

普通函数与模板函数的区别:
(1) 普通函数:参数值未定,但参数类型确定
(2) 函数模板:参数值未定,而且参数类型未定

temple模板
我们编写一个模板->在编译的时候自动生成它在某个类型下的版本
简单地讲我们把重载的过程交给了编译器去做

#include <bits/stdc++.h>

using namespace std;

template<typename T> // 参数表  typename是说明T是某个类型  T模板参数类型
T add(T x, T y) {
    return x + y;
}

template<class T>
void append_num(T *arr, int size) { // 数组添加一个元素
    T items[size + 1];
    for (int i = 0; i < size; i ++) {
        items[i] = arr[i];
    }

    items[size] = items[size - 2] + items[size - 1];
    for (int i = 0; i < size + 1; i ++) {
        cout << items[i] << endl;
    }
}


int main() {
	// <>是用来告诉编译器你输入的参数是哪个类型的,进而生成对应的函数模板
	// 比如<string> 告诉编译器T *arr 应该是string *arr
    string s[] = {"1", "1", "2", "3", "5"};
    append_num<string>(s, 5);

    cout << "______" << endl;

    int nums[] = {1, 1, 24, 3, 5};
    sort<int*>(nums, nums + 5);  // 通常<int*>省略,因为你自己不好判断
    append_num<int>(nums, 5);

    cout << "______" << endl;

    // 通过模板生成函数的过程,称为实例化
    cout << add<double>(1.5, 2.2) << endl;   // 把模板中的T全部换成double
    cout << add<int>(1, 2) << endl;      // 这两个其实是两个函数

    // 不加<类型>也行,因为编译器会根据你跟的参数类型自动判断是哪一种



    return 0;
}

转载:https://blog.csdn.net/qq_43827595/article/details/101452917
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场