# Template
蕭博文是智障 上面有按鈕可以按
ok的
是在靠北喔 有啊 上面那個
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一樣
戴文凱考大家

如何寫成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

寫法只是改成T
上面加上template <class T>
但實作的function要變成
語法

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的時候就要決定了
我自己也沒被
你在靠背
我不熟悉阿
哪案