maya's blog

About programming, aws and ubuntu

C++ テンプレート

テンプレートとは

wikipedia*1より

プログラミングにおけるテンプレートは、静的型付けのC++でデータ型にとらわれずにコードを書くことを可能にする機能であり、C++においてはジェネリックプログラミングに用いられる。

言葉は聞いたことあったけれど、使うまではどんな機能なのか知らなかった。 まずは簡単な例から

2つの数字を引数に取り、その和を返す関数を定義してみる。

pythonであれば以下のように書ける。

def add(x, y):
    return x + y

assert 2 == add(1, 1)
assert 5.3 == add(2.0, 3.3)
assert 1.5 == add(1, 0.5)

数字といっても整数・実数があり、 このように動的言語であれば実行時に型が決まるので、引数が整数(int)だろうがdouble(実数)だろうが問題なく動く。

しかし、C++だと予め型を指定する必要があるので、↑のpythonの例を満たすには以下の3つの関数を定義する必要がある。

  1. int add(int x, int y);
  2. double add(double x, double y);
  3. double add(int x, double y);

型だけが異なる関数を都度何個も定義するのは効率が悪い。

そこでテンプレートを使う。

template <typename T>
T add(T x, T y)
{
    return x + y;
}

...

int main()
{
    cout << add(1, 1) << endl;             // -> 2
    cout << add(2.0, 3.3) << endl;         // -> 5.3
    // cout << add(1, 0.5) << endl;        // build error
}

3.の場合はint, doubleで異なる型で演算をしているのでbuild時にエラーになる。