2014年2月25日火曜日

C++ テンプレート関数




テンプレート関数の機能は

複数の型に対応した関数を

つくれることです(^^)






テンプレート関数とは、引数や戻り値の型が曖昧な状態の関数です。

そのためコンパイラが、テンプレート関数の呼び出し方を判断して、

具体的な関数に置き換えて処理するのです(*^^)v 賢い!

template<class T>
T GetMaxValue(T num1, T num2)
{
    T temp;

    if (num1 > num2) temp = num1;
    else temp = num2;

    return temp;
}

この class T とか書いてあるところが、テンプレート引数というものです。

別に T である必要はありませんが、分かりやすいし無難に倣っておくのが

良いのではないかと... テンプレートのTということで。(^^;)

仮の型名なので、関数を使用するときに int や double に置き換わります。

ここでは、関数の引数と戻り値に使っています。

関数の呼び出し方法は、特に変わった点はなく

普通に呼び出すだけで使えます(^^)

では、サンプルプログラムで見てみましょう。

include <stdio.h>
#include <iostream>

using namespace std;

// 与えられた引数のうち大きいほうの値を返します
template<class T>
T GetMaxValue(T num1, T num2)
{
    T temp;

    if (num1 > num2) temp = num1;
    else temp = num2;

    return temp;
}

int main(void)
{
    int a = 10;
    int b = 15;
    double c = 3.14;
    double d = 1.23;

    printf("a : %d, b : %d\n", a, b);
    int ans = GetMaxValue(a, b);  //int型を指定した呼び出し
    printf("ans : %d\n", ans);

    cout << "c : " << c << ", d : " << d << endl;
    double ans2 = GetMaxValue(c, d); //double型を指定した呼び出し
    cout << "ans2 : " << ans2 << endl;

    return 0;
}

実行結果
# ./test
a : 10, b : 15
ans : 15
c : 3.14, d : 1.23
ans2 : 3.14

Cでは、int型用、double型用などと2つの関数を

用意しなければなりませんでしたが、

このように一つにまとめることができました。

さすが、C++ 

インクリメントされてるので、ちゃんと進んでるのがわかりますね(^^;)


今日の名言
取り越し苦労をして先のことばかりに目を向け、まだ嵐がやってこない
うちから気をもんで、どうやって防ごうかとうろたえるようでは、神に対する
信頼を失ってしまう。まだこれからどうなるかわからないのに、打つ手や
失敗した時のことまで考えて、わが身を地獄に陥れるとき、我々は
恐怖心を追放してくれるあの「完全な愛」(神)から、完全に見放されて
いるのだ。
                         ヘンリー・ウォード・ビーチャー

まず確かな事実を手元に集めることだ。公平な目でありとあらゆる
事実を集めないうちには、問題に手も触れないことにしよう。
                         デール・カーネギー

ついに起こらなかった害悪のために、我々はいかに多くの時間を
費やしたことか!
                         トーマス・ジェファーソン