- # C言語/C++入門 > テンプレート・STL
テンプレートでの関数の特殊化
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
C++のテンプレートで、紹介した大きいほうの値を返す関数maxですと、Cの文字列の比較が行えません。
スポンサーリンク
Cの文字列は・・・
const char *name = "Tom";
と、文字ポインタ「char *」で表されるために・・・
template<typename type>
type max(type d1, type d2) {
if (d1 > d2)
return (d1);
return (d2);
}
において、文字列へのポインタの値が比較され、実際には文字列ではなく、アドレスが比較されることになります。
こういった特殊な場合を別途に定義するために、テンプレート関数の特殊化という機能を使えます。
実際には、特殊な場合の処理の関数を別に定義するだけですので、難しくはありません。
では、まずは関数の特殊化を行わずに、テンプレートを書いて文字列を比較してみます。
#include <iostream>
template<typename type>
type max(type d1, type d2) {
if (d1 > d2)
return (d1);
return (d2);
}
int main() {
char ch = max('ABCD', 'AXYZ');
std::cout << max("ABCD", "AXYZ") << "\n";
return 0;
}
実行結果。
ABCD
これは、期待した結果ではありません。
文字列として比較した場合は、AXYZのほうが大きいからです。
では、次に関数の特殊化を行ってみます。
#include <iostream>
template<typename type>
type max(type d1, type d2) {
if (d1 > d2)
return (d1);
return (d2);
}
// Cの文字列比較の関数を特殊化
const char *const max(const char *const d1, const char *const d2) {
if (std::strcmp(d1, d2) > 0)
return (d1);
return (d2);
}
int main() {
char ch = max('ABCD', 'AXYZ');
std::cout << max("ABCD", "AXYZ") << "\n";
return 0;
}
実行結果。
AXYZ
期待した結果を得られました。
スポンサーリンク
>> 次の記事 : クラステンプレート
<< 前の記事 : C++のテンプレート
スポンサーリンク