チャックブログ

UnityやC#などをメインに公開していきます。C++も勉強始めました!

【C++】テンプレート完全に理解したぃ

初めに

C++のテンプレートを触ってみたい、テンプレートってなに?って人向けの記事となっています。 (ぶっちゃけ自分も最近知ったものなので完璧ではないような気がします)

例えば

こんな関数があったとします

int Add(int a,int b)
{
    return a + b;
}
float Add(float a, float b)
{
    return a + b;
}

両方とも引数と戻り値の型が違うだけで中身はやっていることが同じです、これ無駄じゃないですか?

そんな時こそテンプレート!

template<typename T>
T Add(T a, T b)
{
    return a + b;
}

int main()
{
    std::string str;

    str = std::to_string(Add(114, 514));
    printf("合計:%s\n", str.c_str());

    str = std::to_string(Add(114.0f, 514.0f));
    printf("合計:%s\n", str.c_str());
}

実行結果 f:id:tilyakuda:20190626112138p:plain こんな感じで一つの関数テンプレートでint型とfloat型の合計した数値を出すことができました。(例がなんかアレだけど気にしない) int float char string様々な型に対応しております。

intの時だけは別の処理にしたいんだけど?

可能です!

template<typename T>
T Add(T a, T b)
{
    return a + b;
}
template<>
int Add(int a, int b)
{
    return a * b;
}

int main()
{
    std::string str;

    str = std::to_string(Add(114, 514));
    printf("合計:%s\n", str.c_str());

    str = std::to_string(Add(114.0f, 514.0f));
    printf("合計:%s\n", str.c_str());
}

実行結果 f:id:tilyakuda:20190626114220p:plain こんな感じにint型が使われた時だけ乗算処理させてみました。

テンプレートはほかにも

  • 関数テンプレート
  • クラステンプレート
  • メンバテンプレート
  • エイリアステンプレート があります。

まとめ

テンプレート完全に理解した…ぃ