Templateの基礎です。
なんだかんだで、勉強不足で知らないことが多かったのでまとめたいと思います。
なんだかんだで、勉強不足で知らないことが多かったのでまとめたいと思います。
まず、引数の型からテンプレートパラメータが自動決定される、よくあるテンプレート関数です。
上記の場合、func1(100)などとすれば型が自動確定しますが、func1<char>(100)などとして、明示的にテンプレートパラメータで指定することもできます。
次は明示的なテンプレートパラメータ指定が必須な場合です。
戻り値にテンプレート型が使用されており、引数による型の自動特定はできません。
上記を使用する場合、func2<char>(100)などのようにして明示的にテンプレートパラメータを示さないとエラーになります。
また、下記のようにテンプレートパラメータが2つ以上ある場合においては、明示と省略表現を混在できます。
また、下記のようにテンプレートパラメータが2つ以上ある場合においては、明示と省略表現を混在できます。
例えば、func3<char>(100)とも、func3<char,int>(100)とも書けます。
さらに、次のような型を指定したテンプレート関数を作ることもできます。
さらに、次のような型を指定したテンプレート関数を作ることもできます。
使うときにはfunc4<2>(10)などとします。
当然ですが、テンプレート関数はコンパイル時に静的に生成されるため、func4<a>(10)のように、テンプレートパラメータに変数を指定することはできません。
動的なパラメータは大人しく引数で渡して下さい。
しかし、ここで挙げたサンプルだけ見ると、テンプレートの利点がよく飲み込めないですね。
#defineなどのプリプロセッサと本質何が違うのでしょうか?なんとなくかっこ良く見えるとか?
実際書いててよくわからなくなってきました。
例えば、テンプレートの場合は、型がより安全に扱えるという利点があると思います (プリプロセッサは単なる文字列の置換にすぎないので)。 しかし、Policy-based Designのような技巧的な手法を使わないとtemplateの本領は見えてこないのかもしれないです。
プログラム中にはなるべく即値(イミディエイト)を書くべからずとはよく言われますが、そういう意味では#defineもtemplateも発想の着眼点は同じなのかもしれません。
例えば、テンプレートの場合は、型がより安全に扱えるという利点があると思います (プリプロセッサは単なる文字列の置換にすぎないので)。 しかし、Policy-based Designのような技巧的な手法を使わないとtemplateの本領は見えてこないのかもしれないです。
プログラム中にはなるべく即値(イミディエイト)を書くべからずとはよく言われますが、そういう意味では#defineもtemplateも発想の着眼点は同じなのかもしれません。