2017年10月11日
《その74》 関数テンプレート(p.331演習9-3,演習9-4,演習9-5)
関数テンプレート
次の多重定義されている二つの関数は、受け取る配列の型が異なる以外は全く同じ構造であるものとします。
@ int func_a (const int a[], int n)
{
配列 a の最大値を返却する
}
A double func_a (const double a[], int n)
{
配列 a の最大値を返却する
}
このとき、二つの関数 @, Aを、関数テンプレートという形で一つにまとめることができます。
template <class Type> Type func_a(const Type x[], int n);
↑
class の代わりに typename としてもよい。
テンプレート関数の呼び出しは、普通の関数のときと同じです。
コンパイラは、引数の型から Type の型を自動で判断してくれます。
新版明解C++入門編 p.331 演習9-3
x の2乗を求める関数テンプレート square を作成せよ。
templateType square(Type x);
// p331_演習9-3
#include <iostream>
using namespace std;
template <class Type> Type square(Type x)
{
return x * x;
}
int main()
{
int n; double a;
cout << "整数 : "; cin >> n;
cout << "2乗は " << square(n) << '\n';
cout << "実数 : "; cin >> a;
cout << "2乗は " << square(a) << '\n';
}
新版明解C++入門編 p.331 演習9-4
二値の最小値を求める関数テンプレート minof を作成せよ。
// p331_演習9-4
#include <iostream>
using namespace std;
template <class Type> Type minof(Type x, Type y)
{
return x > y ? y : x;
}
int main()
{
int m, n; double a, b;
cout << "整数m : "; cin >> m;
cout << "整数n : "; cin >> n;
cout << "実数a : "; cin >> a;
cout << "実数b : "; cin >> b;
cout << "整数m と 整数n の最小値 : "; cout << minof(m, n) << '\n';
cout << "実数a と 実数b の最小値 : "; cout << minof(a, b) << '\n';
cout << "整数m と 実数a の最小値 : "; cout << minof<double>(m, a) << '\n';
}
/*
整数m と 実数a の比較では、コンパイラが Type の型を決められないので、テンプレート関数呼出し時
に型を指定する(明示的な具現化)。
minof<double>(m, a);
*/
新版明解C++入門編 p.331 演習9-5
配列の全要素の最小値を求める関数テンプレートを作成せよ。
templateなお、最も小さい文字列を求められるようにするために、const char*型に明示的に特殊化したものをあわせて作成すること。Type minof(const Type a[], int n);
// p331_演習9-5
#include <iostream>
#include <cstring>
using namespace std;
template <class Type> Type minof(Type a[], int n)
{
Type min = a[0];
for (int i = 1; i < n; i++)
if (a[i] < min) min = a[i];
return min;
}
/* const char* 型用に特殊化した関数定義(明示的な特殊化) */
template <> const char* minof<const char*>(const char** a, int n)
{
const char* min = a[0];
for (int i = 1; i < n; i++)
if (strcmp(a[i], min) < 0) min = a[i];
return min;
}
int main()
{
int a[] = { 1, -5, 7, -3, 0, 10, 12, -6 };
double b[] = { 1.33, -5.68, -5.7, 0, 7.2 };
const char* c[] = { "ABC", "ABBZ", "XYZ", "AC", "BCAAA" };
cout << "配列 aの最小値 : ";
cout << minof(a, sizeof(a) / sizeof(a[0])) << '\n';
cout << "配列 bの最小値 : ";
cout << minof(b, sizeof(b) / sizeof(b[0])) << '\n';
cout << "配列 cの最小値 : ";
cout << minof(c, sizeof(c) / sizeof(c[0])) << '\n';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6797492
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック