関数のオーバーロードは、引数の数や型が異なっていれば同じ名前の関数が作れるというものでした。
しかし、中身が全く同じ関数を何個も書くのも面倒です・・・
例えば、↓のサンプルを見てください。
<sample program cpp011-01>
#include <iostream> void ShowValue(const int value); void ShowValue(const double value); void ShowValue(const char* value); int main() { ShowValue(46); ShowValue(12.5); ShowValue("Hello"); return 0; } void ShowValue(const int value) { std::cout << "value = " << value << std::endl; } void ShowValue(const double value) { std::cout << "value = " << value << std::endl; } void ShowValue(const char* value) { std::cout << "value = " << value << std::endl; } |
<実行結果>
value = 46 value = 12.5 value = Hello 続行するには何かキーを押してください・・・
3つのShowValue関数は、引数の型が異なります。
関数の呼び出しの際の引数の型を判断して、どの関数を使うか判断しています。
3つの関数の本体を見てください。
中身はまったく同じです。(そうなるように作りました・・・)
このようにまったく同じ内容でオーバーロードされた関数を作る場合、テンプレートというものが役立ちます。
テンプレートとは「オーバーロードされた関数を自動的に作ってくれるもの」と考えておいても良いでしょう。
上のプログラムをテンプレートを使って書き換えてみます。
<sample program cpp011-02>
#include <iostream> #include <string> template <class Value> void ShowValue(Value value); int main() { ShowValue(46); ShowValue(12.5); ShowValue("Hello"); return 0; } template <class Value> void ShowValue(Value value) { std::cout << "value = " << value << std::endl; } |
<実行結果>
value = 46 value = 12.5 value = Hello 続行するには何かキーを押してください・・・
3つあった関数は1つに集約されました。
実行結果も変わっていません。
プロトタイプ宣言、本体ともに「template」の宣言が付いています。
template <class Value> |
この「class Value」の部分が型によって変化するところになります。
引数が「46」の場合は、Valueは「int型」になります。 引数が「12.5」の場合は、Valueは「double型」になります。 引数が「"Hello"」の場合は、Valueは「char*型」になります。
これがあれば、同じ物をいくつも作る必要がなくなります。
※実際には、C++側で3つの関数を作ってくれていますのでプログラムの容量が減ったりはしません・・・
次回からは、C++で用意されている「標準テンプレートライブラリ」を使ったプログラムを紹介します。