ジェネリックプログラミング-テンプレート

今回はちょっと変えてジェネリックプログラミング。

ジェネリックと聞くと薬で特許が切れるやつ?ということを思いつくが(私だけかもしれないが)
ことプログラミングに関しては、

ジェネリックプログラミング

ジェネリクスとは、プログラミング言語の機能・仕様の一つで、同じプログラムコードで様々なデータ型のデータを処理できるようにするもの。C++言語などではほぼ同様の機能を「テンプレート」(template)という。

ということらしい。
なわけで今回はテンプレートを簡単に勉強。

よく例で出てくるのは足し算をする処理が何度も出てくるので関数化する、というのがすぐに出てくると思います。

int型の二つの引数を取ってその和を返す関数。これはこれでOKだがしかしdoubleやfloatだとそれ用の関数を用意しないといけない。
なのでそれを対応するやり方としてまずマクロがある。

しかしマクロは使っちゃだめよ、と言われている。その理由としては型安全ではない、型推論もできないとかになる。
また以下の例のマクロは二つの数の掛け算。

しかしこれが

とすると結果は6となります。
これは

とされてしまうためで正しくは

とすると正しく計算される。今回の例では二つの数をかけただけの単純なものだが複雑なものだと括弧がいっぱい出てきて
非常に見づらい、とかあるので使うにしても慎重にならないといけない。

テンプレートを使うとこうなる。

こんなんがあって

こうなって

こうなる。これでstd::listやstd::vectorでも配列でもOK

InputIteratorは実際にそういうクラスがあるわけではなく便宜的にわかりやすい名前にしているだけ。
次の位置に移動できる(f++)、指し示すデータを参照(*f)ができれこのテンプレートはOK

テンプレートは関数だけでなくクラスもOK

に。
ちなみにC++17からはコンストラクタに渡される値によって、クラステンプレートのテンプレート引数を推論できる。
https://cpprefjp.github.io/lang/cpp17/type_deduction_for_class_templates.html

なので

とコンストラクタが定義されていた場合

でOK。(当然C++14とかだとエラーになります)

About the author

naito06

C++やったり、PythonやったりPHPだったり。

Add Comment

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

By naito06

最近の投稿

アーカイブ

カテゴリー

タグクラウド

コーポレートサイト