---
# System prepended metadata

title: 關於過載和模板的一些事情
tags: [C++]

---

---
title: 關於過載和模板的一些事情
tags: C++
---
# 過載Overloads
就是可以同個函式但是不同類型的參數
```cpp=
int operate (int a, int b)
{
  return (a*b);
}

double operate (double a, double b)
{
  return (a/b);
}
```
:::warning
過載不能只有回傳值不同
必須要至少一個參數不同
:::
# 模板Templates
### 用法
```cpp
template <template-parameters...> function-declaration
```
```cpp=
template <class T, class U>
bool are_equal (T a, U b)
{
  return (a==b);
}
```
>`class` 或是 `typename` 關鍵字都可以用

也就是說 Template 就是告訴編譯器我有個特定的型態可以用
我會使用這些型態做一些事情
```cpp=
bool = value_1 ;
// 告訴編譯器我是用<int,double>這個模板的函數
value_1 = are_equal<int,double>(10,10.0);
// 不告訴編譯器也是可以的 他會幫我判定型態
value_1 = are_equal(10,10.0);
```
### 不設類型用法 Non-type template arguments
當然 我也可以把不確定的型態跟確定的型態一起用
```cpp=
// template arguments
#include <iostream>
using namespace std;

template <class T, int N>
T fixed_multiply (T val)
{
  return val * N;
}

int main() {
  std::cout << fixed_multiply<int,2>(10) << '\n';
  std::cout << fixed_multiply<int,3>(10) << '\n';
}
```
:::warning
要注意的是 我告訴編譯器的內容是
我要用 N 建立一個新的函式
所以 N 必須是一個 int 型態的常數 不是變數
因此在使用模板時 N 不能帶入變數 要是個明確的數字
:::
