29.1 テンプレートの役目
/* テンプレートの機能 */
省略
/* テンプレートの記述 */
関数テンプレートの基本的な記述スタイル。
template <typename 型識別子> 戻り値の型 関数名(仮引数リスト)
{...}
大きいほうの値を返す関数maxdt()のテンプレート
template <typename T> T maxdt(T a, T b)
{
if (a > b) {
return a;
}
else {
return b;
}
}
/* テンプレート記述スタイル */
typenameを使う
template <typename T> T myfunc(T a, T b) {...}
classを使う
template <class T> T myfunc(T a, T b) {...}
複数の型識別子を使う
template <typename T1, typename T2> T1 myfunc(T1 a, T2 b) {...}
template指定部分で改行する
template <typename T1, typename T2>
T myfunc(T1 a, T2 b) {...}
クラステンプレートを記述する
template <typename T> class Mycls {...};
29.2 関数テンプレートを使う
29.3 明示的な具現化
29.4 関数仮引数に基本データ型を使う
省略
29.5 戻り値の型指定
29.6 関数テンプレートの多重定義
29.7 関数テンプレートの特殊化
29.8 型引数と値引数
29.9 特別バージョンの簡略化
省略
29.10 一般関数の多重化
29.11 クラステンプレートを使う
/* クラスの型枠を作る */
/* typedefで型指定しておく */
クラステンプレートは引数として型指定するのが必須です。
もしクラステンプレートを多用する場合は、typedefで型指定しておくのが常套手段です。
typedef mystack<int> int_stack;
int_stack istk;
/* メンバ関数を外部に記述する */
template<typename T> class mystack {
private:
int ct;
T data[100+1];
public:
mystack() { ct = 0; }
void push(T dt);
T pop();
};
template<typename T> void mystack<T>::push(T dt)
{
if (ct < 100) data[++ct] = dt;
}
template<typename T> T mystack<T>::pop()
{
if (ct > 0) return data[ct--];
else return 0;
}
/* 複数の汎用データ型を使う */
typename指定を複数使うこともできます。
template<typename> T1, typename T2> class Mycls {
private:
T1 dt1;
T2 dt2;
};
このクラスを使うときは次のようにします。
Mycls<int, int> a;
Mycls<int, double> b;
Mycls<double, double> c;
29.12 クラステンプレートに値引数を渡す
29.13 クラステンプレートにクラスを渡す
29.14 クラステンプレートにテンプレートを渡す
29.15 デフォルトテンプレート引数
/* デフォルトの型と値の指定 */
/* デフォルトのテンプレートの指定 */
29.16 クラステンプレートの特殊化
29.17 テンプレートの分割とexport宣言
省略
29.18 typenameの型明示用法