---
# System prepended metadata

title: Template

---

# 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的時候就要決定了



我自己也沒被
你在靠背 
我不熟悉阿
哪案

