日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据

發(fā)布時間:2024/9/27 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


1.函數(shù)模板初級,如果想使用模板,需要實例化,實例化的方式是加上<數(shù)據(jù)類型>

#include <iostream>

?

//函數(shù)模板可以對類型進行優(yōu)化重載,根據(jù)類型會覆蓋

//如果仍然要使用模板函數(shù),需要實例化

?

template<class T>

T add(T a, T b)

{

??? std::cout << "T add " << std::endl;

??? return a + b;

}

?

int add(int a, int b)

{

??? std::cout << "int add " << std::endl;

??? return a + b;

}

?

void main()

{

??? int a = 10, b = 20;

??? double db1 = 10.9, db2 = 10.8;

??? add(db1, db2);

??? add(a, b);

??? //這里加上了<int>相當于實例化,調(diào)用了模板

??? add<int>(a, b);

?

??? std::cin.get();

}

運行結果如下:

2.模板的重載,模板的重載會根據(jù)數(shù)據(jù)類型自動匹配

#include <iostream>

#include <array>

using std::array;

?

template<typename T>

void showarray(array<T, 10> myarray, int n)

{

??? using namespace std;

??? cout << "TTTTT" << endl;

??? for (int i = 0; i < n; i++)

??? {

??????? cout << myarray[i] << " ";

??? }

??? cout << endl;

}

?

template<typename T>

void showarray(array<T*, 10> myarray, int n)

{

??? using namespace std;

??? cout << "T*T*T*T*T*" << endl;

??? for (int i = 0; i < n; i++)

??? {

??????? cout << *myarray[i] << "? ";

??? }

??? cout << endl;

}

?

void main()

{

??? array<int, 10> intarray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

??? array<int*, 10> pintarray;

??? for (int i = 0; i < 10; i++)

??? {

??????? pintarray[i] = &intarray[i];

??? }

??? array<int**, 10> ppintarray;

??? for (int i = 0; i < 10; i++)

??? {

??????? ppintarray[i] = &pintarray[i];

??? }

??? showarray(intarray, 10);

??? showarray(pintarray, 10);

??? showarray(ppintarray, 10);

?

??? std::cin.get();

}

運行結果如下:

3.通用函數(shù)可變參數(shù)模板

#include <iostream>

?

//通用可變參數(shù)模板??? 處理不限定個數(shù)的參數(shù),處理不同類型

?

//空函數(shù),接口,用于最后結束遞歸 適用于新版本的編譯器

void showall(){}

?

template<typename T, typename...Args>

void showall(const T &value, const Args &...args)

{

??? std::cout << value << std::endl;

??? showall(args...);?? //繼續(xù)傳遞

}

?

//設計可以修改原來的數(shù)據(jù)的T &value,? Args&...args

//設計可以修改副本?? T value,? Args ...args

//設計不可以修改原來的數(shù)據(jù),不可以修改副本const T value,? const Args...args

//設計引用原來的數(shù)據(jù)不可以修改 const? T &value,? const Args &...args

?

void main()

{

??? int num1 = 10, num2 = 9, num3 = 11;

??? double db1 = 10.8, db2 = 10.9;

??? char str[40] = "yincheng";

??? char ch = 'A';

??? showall(num1);

??? std::cout << "\n";

??? showall(num1, num2, num3);

??? std::cout << "\n";

??? showall(db1, db2, num1, ch);

??? std::cout << "\n";

??? showall(db1, db2, num1, ch, str);

?

??? std::cin.get();

}

運行截圖如下:

4.函數(shù)模板覆蓋,并實現(xiàn)參數(shù)互換

#include <iostream>

?

//函數(shù)模板實現(xiàn)通用,可以根據(jù)自有數(shù)據(jù)類型,進行優(yōu)化

?

//結構體和類沒有私有變量時才可以直接賦值初始化

//所有成員都是公有的類型可以賦值初始化

?

struct info

{

??? char name[40];

??? double db;

??? int data;

};

?

template<typename T>

void swap(T &a, T &b)

{

??? std::cout << "通用函數(shù)模板" << std::endl;

??? T temp = a;

??? a = b;

??? b = temp;//交換變量

}

?

//模板為空,明確參數(shù)類型,覆蓋函數(shù)模板的類型

//template<>?? //這里可有可無

void swap(info &info1, info &info2)

{

??? std::cout << "特有函數(shù)模板" << std::endl;

??? //通過模板可以實現(xiàn)通用,針對自己的數(shù)據(jù)類型做出優(yōu)化

??? info temp = info1;

??? info1 = info2;

??? info2 = temp;

}

?

void main()

{

??? info info1 = {"tuzuoquan",20.9,10};

??? info info2 = { "quanzuotu",9.2,1 };

??? swap(info1, info2);

??? std::cout << info1.name << info1.db << info2.data << std::endl;

??? std::cout << info2.name << info2.db << info2.data << std::endl;

??? std::cin.get();

}

運行結果:

5.通過引用的方式實現(xiàn)參數(shù)互換

#include <iostream>

?

//函數(shù)模板實現(xiàn)通用,可以根據(jù)自有數(shù)據(jù)類型,進行優(yōu)化

?

//結構體和類沒有私有變量時才可以直接賦值初始化

//所有成員都是公有的類型可以賦值初始化

template<typename T>

void swap(T &a, T &b)

{

??? std::cout << "通用函數(shù)模板" << std::endl;

??? T temp = a;

??? a = b;

??? b = temp;//交換變量

}

?

void main()

{

??? int num1 = 100;

??? int num2 = 10;

??? swap(num1, num2);//實現(xiàn)交換

??? std::cout << num1 << "? " << num2 << std::endl;

??? char? ch1 = 'Z';

??? char? ch2 = 'A';

??? //注意,要指定使用模板,這里要使用<類型名稱>

??? swap<char>(ch1, ch2);

??? std::cout << ch1 << "? " << ch2 << std::endl;

?

??? std::cin.get();

}

6.可變參數(shù)模板

#include <iostream>

#include <cstdarg>

?

void showall(){}? //預留一個

?

template <typename T>

void show(T t, ...)

{

??? std::cout << t << std::endl;

}

template <typename T, typename...Args>

void showall(T t, Args...args)

{

??? std::cout << t << std::endl;

??? showall(args...);

}

?

void main()

{

??? int num1 = 10, num2 = 9, num3 = 11;

??? double db1 = 10.8, db2 = 10.9;

??? char str[40] = "yincheng";

??? char ch = 'A';

??? show(num1);

??? showall(num2, num3);

??? showall(num2, num3, num1, str, ch);

?

??? std::cin.get();

}

運行結果如下:

?

?

?

總結

以上是生活随笔為你收集整理的函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。