函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据
1.函數(shù)模板初級(jí),如果想使用模板,需要實(shí)例化,實(shí)例化的方式是加上<數(shù)據(jù)類型>
#include <iostream>
?
//函數(shù)模板可以對(duì)類型進(jìn)行優(yōu)化重載,根據(jù)類型會(huì)覆蓋
//如果仍然要使用模板函數(shù),需要實(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>相當(dāng)于實(shí)例化,調(diào)用了模板
??? add<int>(a, b);
?
??? std::cin.get();
}
運(yùn)行結(jié)果如下:
2.模板的重載,模板的重載會(huì)根據(jù)數(shù)據(jù)類型自動(dòng)匹配
#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();
}
運(yùn)行結(jié)果如下:
3.通用函數(shù)可變參數(shù)模板
#include <iostream>
?
//通用可變參數(shù)模板??? 處理不限定個(gè)數(shù)的參數(shù),處理不同類型
?
//空函數(shù),接口,用于最后結(jié)束遞歸 適用于新版本的編譯器
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ì)可以修改原來(lái)的數(shù)據(jù)的T &value,? Args&...args
//設(shè)計(jì)可以修改副本?? T value,? Args ...args
//設(shè)計(jì)不可以修改原來(lái)的數(shù)據(jù),不可以修改副本const T value,? const Args...args
//設(shè)計(jì)引用原來(lái)的數(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();
}
運(yùn)行截圖如下:
4.函數(shù)模板覆蓋,并實(shí)現(xiàn)參數(shù)互換
#include <iostream>
?
//函數(shù)模板實(shí)現(xiàn)通用,可以根據(jù)自有數(shù)據(jù)類型,進(jìn)行優(yōu)化
?
//結(jié)構(gòu)體和類沒(méi)有私有變量時(shí)才可以直接賦值初始化
//所有成員都是公有的類型可以賦值初始化
?
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<>?? //這里可有可無(wú)
void swap(info &info1, info &info2)
{
??? std::cout << "特有函數(shù)模板" << std::endl;
??? //通過(guò)模板可以實(shí)現(xiàn)通用,針對(duì)自己的數(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();
}
運(yùn)行結(jié)果:
5.通過(guò)引用的方式實(shí)現(xiàn)參數(shù)互換
#include <iostream>
?
//函數(shù)模板實(shí)現(xiàn)通用,可以根據(jù)自有數(shù)據(jù)類型,進(jìn)行優(yōu)化
?
//結(jié)構(gòu)體和類沒(méi)有私有變量時(shí)才可以直接賦值初始化
//所有成員都是公有的類型可以賦值初始化
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);//實(shí)現(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(){}? //預(yù)留一個(gè)
?
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();
}
運(yùn)行結(jié)果如下:
?
?
?
總結(jié)
以上是生活随笔為你收集整理的函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 汽车底盘生锈怎么处理最合适?
- 下一篇: 货车帮怎么删除车辆信息?