Eyes, JAPAN Blog > C++ テンプレート基礎入門

C++ テンプレート基礎入門

Eyes, JAPAN Blog 編集部

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

こんにちは。アルバイトの石井です。
前回はC++入門書の紹介でしたが、今回はC++のテンプレートとはというところに触れていきます。

テンプレートとは静的型付けのC++でデータ型にとらわれることなくコードを書くことができる機能です。
テンプレートには四種類あります。(C++11時点)
関数テンプレート
クラステンプレート
メンバテンプレート
エイリアステンプレート(C++11以降)
百聞は一見に如かずということで見てみましょう。


まず、関数テンプレートというのは関数にテンプレートを用いることです

例えば二つの変数を受け取り大きい値を返すmax(a,b)を実装しようとします。
int型なら int max(int a, int b)
double型なら double max(double a, double b)
このようにそれぞれの型に対応する関数をそれぞれ書いていく必要があります。
これを型にとらわれないテンプレートで書いてみますと
template <typename T> T max(T a, T b)
このように書けます
呼び出す際は
max<int>(2, 1)
max<double>(1.9, 2.1)
このように明示的に書けますし
max(2, 1)
max(1.9, 2.1)
テンプレートの型推論を利用して型を書かなくても大丈夫です。

中身としては

1
これが関数テンプレートです。


次にクラステンプレートなのですが、わかりやすい例としてSTLのvectorやlistなどがあります。
vectorやlistなどのクラスはすべての型に対応させる必要があるので使われます。
書き方は
3
このようにして書きます。


次にメンバテンプレートです。
これはクラス内のメンバ関数のみにテンプレートを用いることです。
書き方は
2
このように部分的にテンプレートを用います。


最後にエイリアステンプレートです。
これはテンプレートの別名を定義するものです。
書きかとしては
template <typename T, typename Allocator>
class Stack;

template <typename T>
using MyStack = Stack<T,MyAllocator<T>>;

MyStack<int> S(n);
このサンプルではアロケータ型のみを先に指定して、要素型を後から指定するために使われています。

今回は四つのテンプレートについてでしたがC++にはテンプレートメタプログラミングというものがあります。
次回はそれについて少し触れていけたらなと思います。

※typenameのところはclassと書いても大きな違いはありませんのでclassでも大丈夫です。

  • このエントリーをはてなブックマークに追加

Comments are closed.