typename
少し古いC++では,テンプレート型を定義するときに
template<class T>
のように書いていたんだけど,
class T
だとT
として受け入れられるのはクラス型のオブジェクトインスタンスだけのような誤解を生みそうなので
最近になってtypename
というキーワードが追加された.
たとえば次の例は絶対値を返す汎用関数abs()
を定義しているのだけど,
これはT
としてint
やfloat
のような基本型がくるのが普通な感じなので,
template<class T>
よりtemplate<typename T>
のほうがしっくりくる.
template<typename T> T abs(T n) { return n > 0 ? n : -n; }
キーワードtypename
のかわりにclass
を使ってもよくて,
template<typename T>
とtemplate<class T>
は同じ意味になる.
もちろんtemplate<class T>
と書いたときはクラス型だけということではなく,
今までどおり,template<class T>
と書いてもint
などの基本型を受け入れることができる.