汎用関数と汎用クラス

前回、関数のオーバーロードについて解説しました。関数のオーバーロードを使えば異なる型に対して同じ関数名をつけることができるという利点がありました。しかし、似たような関数を何個も記述するのは面倒だし、コードが冗長になります。そこで、型をTとおいて記述する関数である汎用関数を使用します。汎用関数により、幅広い型に対応したプログラミングが可能となります。

汎用関数

和を返す関数をオーバーロードで作ると

int wa(int i,int j){
    return i+j;
}

float wa(float i,float j){
    return i+j;
}

double wa(double i,double j){
    return i+j;
}

となります。型が異なるだけであとはどれも全く同じです。これを任意の型をTとおき

T wa(T i,T j){
    return i+j;
}

と書きたいものです。これを実現するのが汎用関数(generic function)です。汎用関数を使用すると

template <class T>
T wa(T i,T j){
    return i+j;
}

と記述できます。具体的にコードを書くと以下のようになります。

#include <iostream>
using namespace std;

template <class T>
T wa(T i,T j){
    return i+j;
}

int main(void){
    int i=1,j=2;
	cout << wa(i,j) << endl;
    return 0;
}
3

すごく短くなっていいですね。汎用関数は使い勝手がいいのでマスターしておきましょう。

汎用クラス

汎用性をクラスにも取り入れることが可能です。汎用関数と同様にクラスの頭に「template <class T>」とつけるだけです。これで任意の型Tに対してクラスを定義できます。

クラスからオブジェクトを作るときは

クラス名<型> 名前;

とします。<型>を忘れないようにしましょう。では、サンプルプログラムを示します。

#include <iostream>
using namespace std;

template <class T>
class A{
	T i;
public:
	A(T j){i=j;}
	T get();
};

template <class T>
T A<T>::get(){
    return i;
}

int main() {
	A<int> a(1); 
	cout << a.get() << endl;
	return 0;
}
1

Aというクラスから、int型のオブジェクトaを作り、iを表示しています。Aのメソッドを定義する際、「template <class T>」を頭につけ、「A<T>::メソッド名」とする点に注意しましょう。

著者:安井 真人(やすい まさと)