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