読者です 読者をやめる 読者になる 読者になる

はわわーっ

はわわわわっ

[cpp] 関数テンプレートを使う

cpp

引数の型が違うだけで処理は同じ関数を作るときとかにテンプレートを使うと便利です。
とりあえず、サンプルコード

#include <iostream>

template <typename TYPE>
TYPE Abs(TYPE a)
{
    return a < 0 ? -a : a;
}

int main() {
    std::cout << Abs(-10) << std::endl;
    std::cout << Abs(-3.14) << std::endl;
}

こうすると

Abs(-10)
Abs(-3.14)

のようにAbs()を呼び出したときに、それぞれ

int Abs(int a)
double Abs(double a)

という関数が呼び出される。

テンプレートの中の処理が実行できるなら、intとかdoubleとかの基本型以外でもいい。例えば

#include <iostream>
#include <string>

template <typename TYPE>
void FillArray(TYPE* array, size_t size, TYPE value)
{
    for(size_t i = 0; i < size; ++i) {
        array[i] = value;
    }
}


template<typename TYPE>
void ShowArray(const TYPE* array, size_t size)
{
    for(size_t i = 0; i < size; ++i) {
        std::cout << array[i] << ' ';
    }
    std::cout << std::endl;
}


int main() {
    const int size = 3;
    int i[size];
    double d[size];
    std::string s[size];

    FillArray<int>(i, size, 0);
    FillArray<double>(d, size, 10);
    FillArray<std::string>(s, size, "hogehoge");

    ShowArray<int>(i, size);
    ShowArray<double>(d, size);
    ShowArray<std::string>(s, size);
}

のような場合、std::stringに対してテンプレート関数を使える。

typenameを明示するときは

FillArray<int>
ShowArray<std::string>

みたいに<>で指定する。