- # 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++のテンプレート
スポンサーリンク