p458〜p473まで

今日はクラステンプレート。

クラステンプレート

うわ、この書き方知らんかった。

template <typename T>
class Hoge
{
  Hoge();
};

template <typename T>
Hoge<T>::Hoge()
{
  // do something...
}

いっつも宣言と定義一緒に書いてたぜ・・・。同一ファイルならこれで宣言と実装分けてかけるからクラスの見え方がすっきりするなぁ。今度からこう書くかな。
これにつながる説明として、こんなのがあった。

Hogeはクラステンプレートであって、クラスではない。
クラステンプレートはテンプレート引数を伴って初めてクラスになる。
p464:上段

おおー、これは個人的にはビビッ!と来た!

クラステンプレートは明示的にテンプレート引数を指定して使う
p462:要点

あんまり意識したことがなかったけれども、確かにそうしないと型が決まんないもんね。説明のところに「基本的に・・・」ってかいてあるのがちょっと気になるけど、今の時点じゃ(・ε・)キニシナイ!!なんもないかもしれんしね。

あ、あと忘れちゃいけないこと。

コンストラクタ名にはテンプレート引数をつけない。
p464:下段

クラステンプレートの宣言内と、メンバ関数の実装のHoge::以降は、
Hogeを省略可能。
p465:上段

テンプレート引数を省略できる場合は勝手にそれが挿入されているとのこと。Hoge::ってやっちゃったらHogeHoge型ってわかっちゃうもんね。

デフォルトテンプレート引数

これは知らなかった。でも多分みたことはある。

template <typename T = char>
class Hoge
{
};

Hoge<> hoge;
Hoge<int> hoge2;

// こんなこともできるお!
template <typename A, typename B = A> // とか
template <typename A, typename B = Hoge<A> > // みたいな

こんな感じでデフォルトテンプレート引数を指定できるらしい。
ちなみに関数テンプレートはデフォルト引数を利用できないみたい。

vector

最後にvectorが出てきた。STLはまだまだ先っぽいけどイテレータの使い方が正直いまいちなので、ちょっとそこら辺はしっかり勉強しようと思う。
ちなみにいっつも先頭要素は&hoge[0]でとってたけど、&hoge.front()でもとれるらしい。知らんかった。
あと、vectorもbool型の配列にはならず、ビット配列として扱われるらしい。まぁvectorなんてbitset覚えたら使わんけど。

テンプレートは思ってたより意外にあっさり終わった。まぁ問題はやっぱり実際に使うときにどれだけの型を許容するか、実際に使う場面を考えて作るってとこになるのかなぁ。あ、あの型がこれだとだめだ・・・、とかってなったりするしね。

今日はここまで。