C++ 泛型编程 -- 函数模版
生活随笔
收集整理的這篇文章主要介紹了
C++ 泛型编程 -- 函数模版
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 定義
- 聲明
- 調(diào)用方式
- 函數(shù)模版的重載
- 函數(shù)模版的特點(diǎn)
工作中一個(gè)同事寫(xiě)了測(cè)試demo,想要自己嘗試使用發(fā)現(xiàn)調(diào)用老出錯(cuò),請(qǐng)教的時(shí)候發(fā)現(xiàn)是函數(shù)模版,有自己的調(diào)用方式,并且發(fā)現(xiàn)核心代碼中大量的函數(shù)模版和類(lèi)模版。
特此做一個(gè)函數(shù)模版相關(guān)的總結(jié),為今后更加熟練的開(kāi)發(fā)做好鋪墊。
定義
C++中,存在泛型編程的概念:即不考慮具體數(shù)據(jù)類(lèi)型的編程方式
函數(shù)模板是一種特殊的函數(shù),可以使用不同的類(lèi)型進(jìn)行調(diào)用,對(duì)于功能相同的函數(shù),不需要重復(fù)編寫(xiě)代碼,并且函數(shù)模板與普通函數(shù)看起來(lái)很類(lèi)似,區(qū)別就是類(lèi)型可以被參數(shù)化
聲明
函數(shù)模版的聲明方式如下:
template <typename T, typename U ...>
void func(T arg1, U arg2 ,...){}
其中:
- template 聲明開(kāi)始進(jìn)行泛型編程
- typename 聲明泛指類(lèi)型 ,即T
調(diào)用方式
- 類(lèi)型的自動(dòng)推導(dǎo) 調(diào)用 func2(a,b)
- 類(lèi)型的指定推導(dǎo) 調(diào)用func2<int,int>(a,b)
實(shí)現(xiàn)如下:
#include <iostream>using namespace std;
template<typename T, typename U>
void func1() {T a;U b;cout << "T value is : " << typeid(a).name() << endl;cout << "U value is : " << typeid(b).name() << endl;
}template <typename T, typename U>
void func2(T a, U b) {T c = a + b;cout << "T value + U value is : " << c << endl;
}int main() {int a , b;a = 10;b = 11;/*第一種類(lèi)型的template function 調(diào)用方式*/func2(a,b);/*第二種類(lèi)型的template function 調(diào)用方式*/func1<char,int>();return 0;
}
輸出如下:
T value + U value is : 21
T value is : c
U value is : i
函數(shù)模版的重載
- C++編譯器優(yōu)先考慮普通函數(shù)
- 如果函數(shù)模板可以產(chǎn)生一個(gè)更好的匹配,那么就選擇函數(shù)模板
- 也可以通過(guò)空模板實(shí)參列表<>限定編譯器只匹配函數(shù)模板
實(shí)現(xiàn)如下:
#include <iostream>using namespace std;/*func3 為重載函數(shù)*/
template <typename T>
void func3(T a) {cout << "funct3(T a) " << endl;
}template <typename T, typename U>
void func3(T a, U b) {cout << "func3(T a, U b)" << endl;
}void func3(int a, float b)
{cout << "fun3(int a, float b)" << endl;
}int main() {int c = 0;float d = 1.0;func3(c); //一個(gè)參數(shù)的模版函數(shù)func3(c,d);//調(diào)用普通函數(shù)fun3(int a, double b),能更完美好匹配func3(d,c);//第一個(gè)參數(shù)為double類(lèi)型,則使用函數(shù)模版func3<>(c,d); //限定只能使用函數(shù)模版return 0;
}
輸出如下:
funct3(T a)
fun3(int a, float b)
func3(T a, U b)
func3(T a, U b)
函數(shù)模版的特點(diǎn)
- 函數(shù)模板是泛型編程在C++中的應(yīng)用方式之一
- 函數(shù)模板能夠根據(jù)實(shí)參對(duì)參數(shù)類(lèi)型進(jìn)行推導(dǎo)
- 函數(shù)模板支持顯式的指定參數(shù)類(lèi)型
- 函數(shù)模板是C++中重要的代碼復(fù)用方式
- 函數(shù)模板通過(guò)具體類(lèi)型產(chǎn)生不同的函數(shù)
- 函數(shù)模板可以定義任意多個(gè)不同的類(lèi)型參數(shù)
- 函數(shù)模板中的返回值類(lèi)型必須顯式指定
- 函數(shù)模板可以像普通函數(shù)一樣重載
總結(jié)
以上是生活随笔為你收集整理的C++ 泛型编程 -- 函数模版的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一箱橙子有20个,如果每千克大约有4个橙
- 下一篇: Rocksdb 与 TitanDb 原理