アフィリエイト広告を利用しています

広告

posted by fanblog

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 を作成せよ。
    template  Type 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';
}

c09_03.png



新版明解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);

*/

c09_04.png



新版明解C++入門編 p.331 演習9-5
 配列の全要素の最小値を求める関数テンプレートを作成せよ。
    template  Type minof(const Type a[], int n);
 なお、最も小さい文字列を求められるようにするために、const char*型に明示的に特殊化したものをあわせて作成すること。

// 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';
}

c09_05.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6797492
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。