テンプレート概要

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

}

参考サイトとか

template

テンプレートの解説とメタプログラミングの例。
templateを使ったif文が興味深い。
また、テンプレートの特殊化や、パラメータの省略についても解説あり。

テンプレートメタプログラミング - Wikipedia

テンプレートを使ったメタプログラムについて解説。

[vcpp 00029744]Re: templateクラスについて

テンプレートはなぜヘッダに実装しなければならないか

参考書籍

Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術 (C++ In‐Depth Series)

Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術 (C++ In‐Depth Series)


テンプレート関係で邦訳されている本では一番良いらしい。

2007/5/18 追記

テンプレートをCPPで実装できない件を別に分けた。


そんな感じー。