網頁

2022/7/25

C++ 函式樣板 function template

C++函式樣板/函式模板(function template)簡介。


函式樣板是指將函式的參數定義為通用的型別(此稱樣板型別),若多個函式擁有相同的邏輯主體且僅參數型別不同時函式樣版可簡化原本的多個函式為一個樣板函式。例如三個多載函式如下,邏輯皆為兩個參數以加號相加並回傳:

int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
string add(string a, string b) { return a + b; }

以上可以函式樣板將參數型態改為通用型態(generic type),語法為template <class T>。接著以樣板型態T作為函式的參數型態。例如下面的add()為樣板函式,其參數型態為樣板型態T。在調用函式樣板時在函式名稱後才以括弧定義參數的實際型態。

main.cpp

#include <iostream>
#include <string>
using namespace std;

template <class T>
T add(T a, T b) {
    return a + b;
}

int main() {
    int x = add<int>(1, 2);
    cout << x << endl; // 3

    double y = add<double>(1.1, 2.2);
    cout << y << endl; // 3.3

    string s = add<string>("foo", "bar");
    cout << s << endl; // foobar

    return 0;
}

呼叫函式樣板時可省略角括弧定義參數型態讓編譯器自動推斷;但字串string無法推斷,調用仍須明確地定義函式參數型態。

main.cpp

#include <iostream>
#include <string>
using namespace std;

template <class T>
T add(T a, T b) {
    return a + b;
}

int main() {
    int x = add(1, 2);
    cout << x << endl; // 3

    double y = add(1.1, 2.2);
    cout << y << endl; // 3.3

    string s = add<string>("foo", "bar");
    cout << s << endl; // foobar

    return 0;
}



沒有留言:

張貼留言