C++の関数テンプレートを使ってみた

クラステンプレートと同様に関数にもテンプレートを使用できます。

関数テンプレートの基本

そこで簡単な関数テンプレートの宣言を使用したコードを作成してみました。以下はT型の引数を取り、T型を返す関数の宣言です。このTは何らかの型を表し、実行時に実際の型が決定されます。

//関数テンプレート宣言
template<class T>
T add(T);

次に上記の関数テンプレートを定義します。処理は単純な値の加算としました。

//関数テンプレート定義
template<class T>
T add(T a) {
  a += a;

  return a;
}

この関数テンプレートのTをintとして関数を実行する場合、以下のように、関数名の後ろに<と>で囲んで使用する型であるintを指定します。

int a = 1;
add<int>(a);

この場合、以下の関数を実行するとの同じことになります。つまり単純にTがintに置き換わって実行されることになります。

int add(int a) {
  a += a;

  return a;
}

intやdouble、stringなど複数の型を指定して、1つのコードでintを取りintを返す関数、doubleを取りdouble返す関数、stringを取りstring返す関数が動的に作成されて便利ですね。

#include <iostream>
using namespace std;

//関数テンプレート宣言
template<class T>
T add(T);

//関数テンプレート定義
template<class T>
T add(T a) {
  a += a;

  return a;
}

int main() {
  int a = 1;
  cout << add<int>(a) << endl;

  double d = 1.2345;
  cout << add<double>(d) << endl;

  string s = "hello";
  cout << add<string>(s) << endl;

  return 0;
}

実行結果は以下になります。

2
2.469
hellohello

自動型推測

関数テンプレートでは型推測が行わるため、明示的にTの型を指定しなくても引数の型に応じて自動で型を推測して実行します。従って以下のような呼び出しも結果は同じです。

int main() {
  int a = 1;
  cout << add(a) << endl; //add<int>(int a)として実行

  double d = 1.2345;
  cout << add(d) << endl; //add<double>(double d)として実行

  string s = "hello";
  cout << add(s) << endl; //add<string>(string s)として実行

  return 0;
}

実行結果は同じです。

2
2.469
hellohello

注意但し推測できない型を指定した場合はエラーになります。

オーバーロード

関数のオーバーロード(多重定義)も行えます。以下のように関数テンプレートと同名の関数を定義した場合、通常の関数が優先されます。一致する関数が存在しない場合は関数テンプレートが呼ばれます。

#include <iostream>
using namespace std;

//関数テンプレート宣言
template<class T>
T add(T);

//関数テンプレート定義
template<class T>
T add(T a) {
  a += a;

  return a;
}

//通常の関数
int add(double a) {
  a += (int)a;

  return a;
}

int main() {
  double d = 1.2345;
  cout << add(d) << endl; //int add(double a)が呼ばれる
  cout << add<double>(d) << endl; //T add(T a) が呼ばれる

  return 0;
}

実行結果は以下となります。

2
2.469

以上、C++の関数テンプレートを使ってみたでした。

今回参考にした書籍

公開日:2020年12月26日
最終更新日:2022年09月12日

他の記事も見る

このページのトップに戻る