テンプレートでの関数の特殊化

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
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

期待した結果を得られました。

スポンサーリンク
 
スポンサーリンク