p442〜p457まで

なんか今日は疲れてるんでちょっとだけ。勉強は毎日続けることが肝心だ。

関数テンプレート

昔、テンプレート引数をあるオブジェクト型のポインタにしようとして、テンプレート引数の参照はHoge*&になんのか?とか思って頭を抱えたことがある。まぁ普通にテンプレート引数のポインタがほしいならT*って定義すればいいだけなんだけれども。

テンプレート引数は仮引数に相当するので英語名はtemplate parameter。

typenameの代わりに書くclassはまったく同じもの。昔のコンパイラでtypenameに対応していない場合にのみ利用するようになってくるのかな。確か、先輩に昔はclassでそれじゃ紛らわしいからtypenameにすることになったとか聞いた気がする。

関数テンプレートは型に合わせた実体を適宜作る。
関数テンプレートの実装は実体を作るところから見えなくてはならない。
p448:要点

昔これではまった。何でコンパイル通んないんだよー!ってなった。なつい。ちなみに、TYPEが同じ関すテンプレートの呼び出しのうちどれか1箇所で関数テンプレートの実装が見えていれば、他のものは別のファイルにしても大丈夫らしい。まぁやんないけど。

テンプレートと継承の違いみたいなことが書いてあった。要約してみる。

テンプレートは静的に型付けがされ、アップキャストを利用した関数の場合動的に型付けがされる。
テンプレートはファイルサイズや動的な処理の切り替えを犠牲にすることで高速に動作し、
継承は速度を犠牲にすることでファイルサイズが小さくなり、
動的な処理の切り替えをおこなうことができる。
p450

関数テンプレート実行時に型が曖昧になってしまうことがある。例えばintとdoubleとか。型を自動的に決められないときにはこうする。

Hoge(i);
Foo(2, 3); // 複数ver
Foo(2, 3.f); // これでもOK

このように明示的に指定したテンプレート引数をテンプレート実引数(template argument)と言う。ここで実引数がでてきたか!この使い方は知らんかったなぁ。

関数テンプレートの実体はこうやって作ることも可能。

template int Hoge(int a); // プロトタイプ宣言の先頭にtemplateをつけた形

ほとんど利用することはなさそうだが、
ヘッダファイルから実装を外してプロトタイプ宣言のみにし、
実装をソースファイルに分離し、上を使って明示的に実体化する。
そうすると他のところでは実装が見えないためコンパイルエラーになる。
p453:コラム

なるほどなぁ。でも多分使わないな・・・。使うとしてもかなり特殊な場合だろうな。

結局関数テンプレート一気にやってしまったorzねみー><;;