C++ 初識template
阿新 • • 發佈:2021-02-10
技術標籤:C++
關於C++的template:
- template並非一次編譯便生出適合所有型別的程式碼,而是針對被使用的(某個或某組)型別進行編譯。
- 這導致一個重要的問題:實際處理 template時,面對template function,你必須先提供它的某個例項,然後才能呼叫。
如此方可通過編譯。
一個簡單的例子:
#include<iostream>
#include<vector>
using namespace std;
template <typename T>
const T Maxs(T a, T b){
return a< b?b:a;
}
int main(int argc, char const *argv[])
{
/*
當代呼叫Maxs(1,2)函式時候,模板中T才會被指定為int型別,這差不多
就是泛型程式設計了
*/
cout<<Maxs(1,2)<<endl;
cout<<Maxs(1.1,2.5)<<endl;
}
Notype Template引數(非類別模板引數)
- 型別(ype)可作為 template引數,非型別( nontype)也可以作為 templat引數。
- 非型別引數因而可被看做是整個 template型別的一部分。例如可以把標準類別bitset<>的 bits 數量以
- template引數指定之。以下述句定義了兩個由bits構成的容器,分別為32個bits空間和50個bits空間
bitset<32> flags32// bitset with 32 bits
bitset<50> flags50/ bitset with 50 bits
注意:32位和50位的bitset不能相互賦值或比較
Default Template Parameters (預設模板引數)
- 例項:允許使用一個或兩個template引數宣告MyClass物件
template<typename T, typename container = vector<T>>
class MyClass{
/*
typename被用來作為型別之前額識別符號號,如:
typename T::SubType * ptr;
T::SubType * ptr;
的區別:
typename指出SubType是 typename T中定義的一個類別,因此ptr是指向T::SubType型別的指標
T::SubType * ptr;則表示型別T的SubType變數和ptr進行相乘
*/
// 成員模板
template<typename T>
void f(T);
/*
void f(T);這種宣告方式,使用任何類別引數。這個特性通常用來為template typename中
的成員提供自動型別轉換。(assign函式就是如此)
*/
T value;
template<typename T>
void assign(const MyClass<X>& x){
value = x.getValue();
}
T getValue()const{
return value;
}
};
//兩種宣告都有效
MyClass<double> x1;
MyClass<int, vector<int>> x2;
x1.value = 11;
x2.assign(x1);
cout<<"x2.value = "<<x2.value<<endl;
Template constructor
/*
Template constructor是成員模板的一種特殊形式,
常用於“複製物件時實現隱式型別轉換”
Template constructor 並不hide implicit COPY constructor,
如果型別完全吻合,implicit COPY constructor就會被產生出來並被呼叫
*/
template<typename T>
class MyClass2{
public:
T value;
template<typename U> //注意巢狀模板,typename的名字不可相同
MyClass2(const MyClass2<U>& x){
value = x.value;
}
};
void f(){
MyClass2<double> xd;
xd.value = 10.5;
MyClass2<double> xd2(xd);//call built-in copy constructor
MyClass2<int> xi(xd);
/*
xd2和xd型別一致,所以被內建的copy ctor初始化。
xi則不同xd所以,所以它使用template ctor進行初始化
*/
}