第34章 冶金工場4

 関数テンプレートをいろいろ使っていると、TYPE が自動的に決まったのでは困るとき、または自動的には決められないときなどがでてくると思います。今回はそういうときのお話です。


 それでは、今回の要点です。


 では、いってみましょう。


 第31章の話の中に p = TMAX(void*, str, &num); というのが出てきました。p の型は void* 、str の型は char* 、num の型は int です。つまり、2つの参照先の型の違うアドレスを比較して、アドレスの大きい方を取得する処理です。

 これと同じことを関数テンプレートの Max を使ってやってみましょう。

プログラム
// Temp3.cpp
#include <iostream.h>

template <typename TYPE>
TYPE Max(TYPE a, TYPE b)
{
    return (a > b) ? a : b;
}

int main()
{
    void* p;
    char  str[100];
    int   num;

    p = Max(str, &num);
    cout << "より大きいアドレスは "
         << p << "です。" << endl;

    return 0;
}
コンパイルエラー
Temp3.cpp(16) : 'TYPE Max(TYPE,TYPE)' : 'TYPE' があいまいです。
                'int *' または 'char *' の可能性があります。

 あらら、コンパイルエラーが出てしまいました。「TYPE を char* にすればいいのか int* にすればいいのか分かりません」と言っています。どうやら、str の型は char* で、&num の型は int* なので、TYPE を何にしていいのかが決められなかったようです。

 このように TYPE を自動的に決められないとき、または自動的に決めて欲しくないときのために、TYPE を自分で決めることができます

p = Max<void*>(str, &num);

 このように関数名の後に < > を付けて、関数に引数を渡すときと同じように、テンプレート引数を指定します。このことを、テンプレート引数を明示的に指定する、といいます。

 テンプレート引数が何個もある場合、初めの何個かだけ指定することができます。例えば、

template <typename TYPE, typename TYPE2> void Disp(TYPE a, TYPE2, b);

で、TYPE を int にし、TYPE2 は自動で決めて欲しければ、

Disp<int>('0', '0');

とできるわけです。

 では、このことを踏まえて Temp3.cpp を修正してみましょう。

プログラム
// Temp3b.cpp
#include <iostream.h>

template <typename TYPE>
TYPE Max(TYPE a, TYPE b)
{
    return (a > b) ? a : b;
}

int main()
{
    void* p;
    char  str[100];
    int   num;

    p = Max<void*>(str, &num);
    cout << "より大きいアドレスは "
         << p << " です。" << endl;

    return 0;
}
実行結果例
より大きいアドレスは 0x0065FD90 です。

 これで無事実行できるようになりました。


 では、今回の要点です。


 次回はテンプレート引数にクラスを指定すると...ということをやります。Max を使って次回までに実験しておくのも面白いですね。

 それでは。


第33章 冶金工場3 | 第35章 冶金工場5

Last update was done on 2000.12.6

この講座の著作権はロベールが保有しています