# Template 蕭博文是智障 上面有按鈕可以按 ok的![](https://i.imgur.com/ZV1fvXJ.png) 是在靠北喔 有啊 上面那個 B I S H 1. Function template 2. Class template ex:報告的格式 預設格式等等等 template就像是一個模板,已經把基本運作的步驟做完了 ```c++ int add(int& a,int&b) { return a+b; } template<class T123A> //template<typename T12341729> T add(T& a,T& b) { return a+b; } ``` 資料架構的邏輯一樣,但型別不一樣-> template ### function template ``` function以template的形式出現 function template ``` ex: 資料做交換 swapValues 因為function長的一模一樣->只是內部資料型別不一樣 所以想說可不可以更方便 ~~~~~ template<class T> void swapValues(T& var1,T& var2) { T temp; temp = var1; var1 = var2; var2 = temp; } ~~~~~ ~~~ 原本是 void swapValues(int& var1,int& var2) { int temp; temp= var1; var1= var2; var2=temp; } ~~~ 就像是演算法主要不用在意資料型別 如果我使用 swapValues(integer1,integer2); 就會把T 換成對應資料型別的function ```c++ template<class T> int main() { cout<<add(1,2);// compile的時候才會生出 cout<<add(1.2,2.4); } ``` template很特別 只有在compiling之後才會產生function 依據我使用的方式才產生對應的東西 如果我的function可以處理各種資料,就換成template->沒有型別的形式 等真的要使用之後compiler會根據資料再產生對應的function ### class template 因為是class template 實作寫法要不一樣 而且如果是class template的話 在main黨如果include class.h -> birthday.h 也必須要include class.cpp -> birthday.cpp 之前都只要.h就好 template<class T1,class T2> ->template<class A,class B> void PrintNumbers(const T1& t1Data,const T2& t2Data) { cout<<"First value:"<<tiData; cout<<"Second value."<<t2Data; } PrintNumbers(10,100); // int,int PirntNumbers(14,14.5) //int double instantiation 意思 compiler真正產生的檔案 ->把它具體化的意思 #.h & .cpp 如果error message告訴妳找不到那個function 理論上 可能是因為妳沒把東西放在一起 因為template比較特別一點 先寫正常的function->發現如果自己的東西甚麼資料型別都能成功(要很確定)->再把它取代成function template ->跟class一樣 戴文凱考大家 ![](https://i.imgur.com/8gyx2fn.png) 如何寫成template template<class T> T max(T X,T Y) { return (X>Y)?X:Y; } 老師是寫 template<typename Type> Type max(Type tX, Type tY) { return (tX>tY)?tX:tY; } 強制轉成int ex:add<int>(1.2,3); ex: GetMax<int>(i,j); 把i j轉成int ### class template 從都是int 版本的pair變成 T pair ![](https://i.imgur.com/8mR4iu6.png) 寫法只是改成T 上面加上template <class T> 但實作的function要變成 語法 ![](https://i.imgur.com/oKeZWJd.png) template<class T> Pair::Pair<T>(......) { } 把v剛開始的元素到end都會拿去摳Printer for_each(v.begin(),v.end(),Printer(std::cout)); function object-> overloading operator() ppt 70葉 11行 讓打function 沒有名字的function 發生甚麼事件回傳的東西 無名的東西 print = function pointer auto print = [](const int& n){std::cout<<" "<<n;} auto aaa = 1; auto = int; auto print 會變成 void (*print)(void); void (*print)(void) =[](const int& n ){std::cout<<" "<<endl;} auto 也可以是functionpointer int (*my_func_ptr)(int, int); my_func_ptr = doAdd; 那個好像有點猛 讓打function 有三種///或是四種 1.template type -> template<typename T,typename T2>//class template class { } 2.template 的non type -> 可以傳**特定資料型別**的template template <const int* pci> struct X{}; 我指定了! 一定要是const int* int ai[10]; X<ai> xi;//型別轉換 int轉成const int 只能傳這種資料型別的資料進來 很像function call struct S { int a[50]; }; S<10> s; 初始化一個struct它裡面的a有10個元素,把初始化寫活 int main() { S xxx; xxx. } ```c++ #include <iostream> using namespace std; template<int N> struct S { int a[N]; }; int main() { // S<N<-代表一個數字ex.10 20 30> S<10> example; cout << sizeof(example.a); //output 40= intbytes*N; } ``` ```c++ template<int size,typename datatype=int> struct S { datatype a[size]; //double a[20]; // int a[100]; }; int main() { // S<N<-代表一個數字ex.10 20 30> S<,10> example; //error if no default datatype //S<double,10> example; //S<int,100> example2; cout<<sizeof(example.a); //output 40= intbytes*N; } ``` template<class T> <- normal type template<template<typename> class V> <- irregular 3.template 的template template <typename T> class A { int x; }; template <class T> class A<T*> { long x; }; template<template<typname> class V> class C { V<int> y; V<int&> z; } C<A> c; ///c.y.x has type long; template package 偏麻煩 template <template<typname TT=char>class T> void A<T>::g() { T<> t;// ok t is T<char> } template <template<typname TT>class T> void A<T>::f() { T<> t;// error TT has no default in scope } vector本身就是一個template string 也是 ---繼承問題 ``` template<typename T> class smartitem : public item<T> { //如果父親也是template 妳繼承一定也是template //要把祖先的template寫進來 // }; --------- 範例如下 template <size_t SIZE> class intArray: public Array<int,SIZE> { }; int main() { intArray<20> Arr; Arr[0]= 10; } ``` 不能virtual 加上template 會Error 因為virtual 在runtime才知道要摳誰 template是在compile的時候就要決定了 我自己也沒被 你在靠背 我不熟悉阿 哪案