今日は、テンプレートについてです。
こいつは素晴らしいですよ。
多分説明する事は数多あるので(1)とか付けておきました。
型なんて関係ない!
こんな事ありませんか?
int型の変数を受け取ってその累乗を返すメソッドを作って使ってたけど、double型でも同じ事をしたくなったよ!
double型を受け取りdouble型を返すメソッドを作り、コピペしますか?
こういう機会が一回だけならそれでも最悪良いかもしれません。
でもfloatでも欲しくなったら?
それだけではありません。そのメソッドの内容に変更が必要になった場合全てのメソッドを修正する必要がありますよね。
抜け漏れなく修正出来るでしょうか?
修正する人が他の人だったら他のメソッドも修正する事に気が付くでしょうか?
半年後の自分だったら存在を忘れているのでは?
コードのコピペは危険がいっぱいです。
オブジェクト指向をある程度触った事がある人なら、共通のクラスを用意して・・・なんて考えるかもしれませんがプリミティブクラスではこれも出来ません。
前置きが長くなりましたが、そこでtemplate様の登場です。
templateはこんなわがままを叶えてくれるんです。
書き方
まずは、書き方を見ていきましょう。
// 宣言
template <typename Type>
Type power(Type a) {
return a * a;
}
int main(void)
{
// int型で使用
CCLOG("%d", power(5));
// double型で使用
CCLOG("%5.2f", power(-5.2));
// float型で使用
CCLOG("%5.2f", power(0.1f));
}
結果は以下です。
25
27.04
0.01
見事色んな型で使用する事が出来ました。
さて、いつもの関数の宣言の仕方と似ていますが見慣れない行がありますね。
template <typename Type>
です。
お察しの通り、これがtemplateの宣言部になります。
また、Typeの部分は自由に決める事が出来ますのでHogehogeとかでも問題ありません。
// これでも問題ありません。
template <typename Hogehoge>
Hogehoge power(Hogehoge a) {
return a * a;
}
誰かのお役に立てば。
コメント