函式模板是統用的函式描述,其使用泛型定義函式,其中泛型可被具體型別(如 int、double)替換。
呼叫模板函式,可以使用自動型別推導或顯式指定型別。
語法:
template ret-type func(parameter list)
注意事項:
示例 1:
下面的**定義了乙個myswap
函式模板,可以交換兩個引數的內容。
#include using namespace std;
// 交換 a 和 b
templatevoid myswap(t &a, t &b)
int main()
示例 2:
下面**基於函式模板實現了選擇排序(公升序)
#include using namespace std;
// 列印陣列
templatevoid printarray(t arr, int len)
cout << endl;
}// 交換 a 和 b
templatevoid myswap(t& a, t& b)
// 選擇排序(公升序)
templatevoid selectionsort(t arr, int len)
}// 交換
myswap(arr[min_idx], arr[i]);
}}void testchararr()
void testintarr() ;
int len = sizeof(int_arr) / sizeof(int_arr[0]);
cout << len << endl;
cout << "排序前 ";
printarray(int_arr, len);
selectionsort(int_arr, len);
cout << "排序後 ";
printarray(int_arr, len);
}int main()
示例:
#include using namespace std;
templatevoid func(t a)
void func(int a)
int main()
模板不是萬能的,有些型別需要具體化方式做實現
例如,下面的函式模板compare
無法比較person
類
class person
templatebool compare(t &a, t &b)
解決方法 1:
過載person
的==
運算子 。
解決方法 2:
過載函式模板,實現具體化呼叫
template<>
bool compare(person &a, person &b)
語法:
template class classname
示例:
#include #include using namespace std;
templateclass person
void show()
nametype m_name;
agetype m_age;
};int main()
#include #include using namespace std;
templateclass person
void show()
nametype m_name;
agetype m_age;
};// 指定傳入型別
void printperson1(personp)
// 引數模板化
templatevoid printperson2(personp)
templatevoid printperson3(t &p)
int main()
示例:
templateclass base ;
// 子類指定型別
class son1 : public base;
// 靈活指定父類中 t 的型別
templateclass son2 : public base;
示例:
宣告
templateclass person ;
定義
// 建構函式類外實現
templateperson::person(nametype name, agetype age)
// 成員函式類外實現
templatevoid person::show()
解決方法1:直接包含.cpp
原始檔
解決方法2:將宣告(class.h
)和實現(.cpp
)寫在同乙個檔案中,改字尾名為.hpp
(.hpp
是約定俗成,非強制)
解決方法 1 示例:
person.h
#pragma once
#include #include using namespace std;
templateclass person ;
person.cpp
#include "person.h"
// 建構函式類外實現
templateperson::person(nametype name, agetype age)
// 成員函式類外實現
templatevoid person::show()
main.cpp
#include "person.cpp"
int main()
解決方法 2 示例:
person.hpp
#pragma once
#include #include using namespace std;
templateclass person ;
// 建構函式類外實現
templateperson::person(nametype name, agetype age)
// 成員函式類外實現
templatevoid person::show()
main.cpp
#include "person.hpp"
int main()
全域性函式類內實現,直接在類內宣告友元即可
全域性函式類外實現,需要提前讓編譯器知道全域性函式的存在
示例:
#include #include using namespace std;
// 需要提前宣告類模板和全域性函式
templateclass person;
templatevoid show2(personp);
templateclass person
// 全域性函式類外實現宣告(需要加模板空引數列表「<>」,告訴編譯器類外實現的是函式模板)
friend void show2<>(personp);
public:
person(nametype name, agetype age);
private:
nametype m_name;
agetype m_age;
};// 建構函式類外實現
templateperson::person(nametype name, agetype age)
// 全域性函式類外實現
templatevoid show2(personp)
類模板中,全域性函式類外實現需要注意 C 函式模板與類模板
一 函式模板 1 函式模板 建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬型別來代表這個通用函式來代表。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中虛擬的型別,從而實現不同函式的功能。作用 功能相同...
C 函式模板與類模板
由菜鳥網整理總結,整理文章 作者做的任務只是將知識點簡化更供人理解以及加了一些自己的認知。模版可以理解成把資料型別做成可以設定的引數化,然後在定義的時候套用,讓資料型別可以隨意變換。使用模板的目的就是能夠讓程式設計師編寫與型別無關的 比如編寫了乙個交換兩個整型int 型別的swap函式,這個函式就只...
C 函式模板與類模板
泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎.模板 函式模板 類模板 1.函式模板概念 函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。2.函式模板格式 template typename t1,typena...