こんにちは!

 

最近、音楽ばかり聴いている気が……(笑)

アップテンポな曲を聴いているとタイピングも進む進む!

 

さて、私、一昨日の授業で汎用関数についてやっていたのですが……如何せん理解が出来ず!

 

「なんだこいつは。出来ることは分かったけれどどゆこと!?」

 

とりあえずプログラムをしたけれどこのままだと身にならないし、そもそも理解できていない!

 

……というわけで、今日は汎用関数についてパラパラと。

 

そもそも汎用ってなんやねん!と思い調べると

「いろいろな方面に用いる」意味だそうです。

 

……色々な方面に用いる関数……?

何でも使える関数ってことかい?

 

ここで、授業中に入力していたサンプルコードを……

 

∞----------------------------------------------------∞
//汎用関数(加算)
template<class T>
T Add(T a, T b)
{
     //加算結果を返す
   return a + b;
}
 
int main()
{
   //整数
   int a = 10;
   int b = 20;
 
     //小数 
   float aa = 6.0f;
   float bb = 8.8f;
 
     //汎用関数の呼び出し
   cout << Add(a, b) << endl;
   cout << Add(aa, bb) << endl;
 
   return 0;
}

∞----------------------------------------------------∞

この汎用関数Addは、数字を加算するもので。

出力結果も

30

14.8

となったので正しい値になりました。

 

 

 

……いや、待て待て。どういうこと?

私の今までの技術能力では

∞---------------------------------------------------∞

//2つの整数の加算
int Add(int a, int b)
{
   return a + b;
}

//2つの数字の加算
float Add(float a, float b)
{
   return a + b;
}

∞---------------------------------------------------∞

 

関数の書き方はこうなるはず。

言ったら悪いけれど引数の型も戻り値の型も違うものね!仕方ないよね!面倒くさいけれどこればっかりは……

 

これは関数をオーバーロードさせて、引数の型と数で判断しているやり方だったんだけれど、今回はたった一つの関数でこの2つの関数の役割をこなしてしまった……なんて便利なんですか!!

 

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

 

まず、このtemplateというものが「汎用関数」である宣言。

仮想関数でいうvertualですよね、きっと。

 

ポイントはその次の<class T>

Tという名前は何でもいいんですよね!変数名みたいな感じ。

 

「……って、Tって何者なんすか……」

 

それが、なんとですよ。

このTは何の型にも変換できるんですって!

なんですと!?

 

template <class T>

 
この一文を関数の前に書くだけで、そのお強いTさんが関数内で使用できる!
……と言われましても、何のことやらさっぱりなので。
 
上の色付き一文はともかく置いときまして関数の書き方と言いますか、解説を……

T Add(T a, T b)
{
   return a + b;
}
 
ハッキリ言って、関数の書き方はそのまま!
Tさんがいるから分かりにくいだけで。
改めて日本語で書くとこうなります。
 
戻り値 関数名 (引数)
{
   関数の中身
}
 
……ね、そのままでしょ?
(書いてて、これ記載する意味あるかなって若干思った……)
aとbの数値を受け取って、中で加算して、加算した値を返すだけ。
 
Tさんは、何の型にもなれる万能さんなので、引数でint型が来ればintで受け取り、int型で返してくれます。
つまり、T=intと置き換えられるわけですね!
 
int main()
{
   int a = 10;
   int b = 20; 
   cout << Add(a, b) << endl;
 
   float aa = 6.0f;
   float bb = 8.8f;
   cout << Add(aa, bb) << endl;
 
   return 0;
}
 
このmain文の中にあるAdd(a, b)は、つまり
int Add(int a, int b)
{
   return a + b;
}
このように関数が切り替わっているってことです。
 
Add(aa, bb)になると
float Add(float a, float b)
{
   return a + b;
}
と、このようにfloat型になってくれるわけですね!
 
もっと言うのなら、double型のaaaとbbbを渡したら、double型になってくれると!
 
 
これを生かしたらさらにプログラムが短くなりそう……!
さて、汎用関数の能力は更にまだまだあるみたいで……。
それは次回の更新で!
 
では以上、あやかでした。