テンプレート概要
c++でテンプレートを使ったので、簡単な概要を。
テンプレートって何?
関数やクラスで型を任意のまま実装可能。
そして、実際に関数を利用するときや、クラスを宣言する時に型を指定。
コンパイラは、指定部分を見つけると、型に対応したコードを自動生成。
そんな仕組み。
利点は?
- 柔軟なコーディング
型が任意のまま実装できる。
- コーディング量の低下
型が違うだけで殆ど同じ実装をまとめるられる。
- 性能の向上
コードでベタベタに書けば処理速度が向上するが、それがあまりにも手間な箇所などでコードを自動生成できる。
メタプログラミングが可能。
欠点は?
具体的な実装は?
#include <iostream> // テンプレート関数。 // <typename T>でTは任意の型と宣言。 template <typename T> println(T t) { std::cout << t << std::endl } void main() { // ここで、型を指定され、テンプレート関数が実体化。 println<char*>("test"); println<int>(1); }
上記の場合、テンプレート関数printlnは、
println<char*>("test");
では、パラメータに char* が指定されているため、引数が char*型の関数が生成される。
println<int>(1);
では、パラメータに int が指定されているため、数が int型の関数が生成される。
パラメータは、戻り値、変数宣言にも利用可能。
例
template <typename T> // 戻り値と変数宣言にテンプレートを使用 T test(T t) { T t2; return t+t2; }
テンプレートクラス
テンプレートの宣言時にtypenameでなく、classを指定すれば、クラスのテンプレートが生成できる。
例えば、こんな感じ。
#include <iostream> // テンプレートを使用したクラス template <class T> class TemplateClass { // コンストラクタ TemplateClass(T* t) { this->t = t; } int getValue() { t->getValue(); } }; // テンプレート実体化の際のステータスに使用 class TestClass { int getValue() { return 100; } }; void main() { // テンプレート実体化 TemplateClass<TestClass> t = new TemplateClass(new TestClass()); // 100が出力される std::cout << t->getValue() << std::endl }
参考サイトとか
テンプレートメタプログラミング - Wikipedia
テンプレートを使ったメタプログラムについて解説。
[vcpp 00029744]Re: templateクラスについて
テンプレートはなぜヘッダに実装しなければならないか
参考書籍
Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術 (C++ In‐Depth Series)
- 作者: アンドレイアレキサンドレスク,Andrei Alexandrescu,村上雅章
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2001/12
- メディア: 単行本
- 購入: 12人 クリック: 214回
- この商品を含むブログ (102件) を見る
テンプレート関係で邦訳されている本では一番良いらしい。
2007/5/18 追記
テンプレートをCPPで実装できない件を別に分けた。
そんな感じー。