2015年04月07日
テンプレート
以前はほどほどに利用していた C++ のテンプレートですが、いろんなことができることがわかってきて最近は頻繁に使うようになりました。
よくサンプルにあるのはこういうものです。
template<typename T> T max( T x, T y )
{
return( ( x < y ) ? y : x );
}
型 T がテンプレート引数で、これを任意の型にすることができます。
double d = max<double>( 0.5, 0.7 ); // double用
int d = max<int>( 16, 10 ); // int用
関数の中では "<" を使って二つの値を比較しています。この演算ができなければコンパイル時にエラーになります。逆に言えば、関数内にある演算や他の関数が利用できる型ならちゃんとコンパイルできるので、普通の組み込み型ではなく任意のクラスなどもテンプレート引数にしてしまうことができます。派生クラスによるポリモーフィズムは動的に変化するのに対し、コンパイル時に型が変化するので静的なポリモーフィズムと言えます。STL はテンプレートを多用しているので、STL をうまく組み合わせるといろんなことが実現できます。これがなかなかおもしろくて、最近ハマっています。
残念なのが、コンパイル時のエラーがわかりづらいこと。慣れないと対処法がわからず、慣れてきても原因がわかりにくいことが多々あります。テンプレートを利用できるのは C++ と D 言語くらいだそうで、D 言語は少し興味があるんですよね。機会があれば勉強したいところですけどね。
よくサンプルにあるのはこういうものです。
template<typename T> T max( T x, T y )
{
return( ( x < y ) ? y : x );
}
型 T がテンプレート引数で、これを任意の型にすることができます。
double d = max<double>( 0.5, 0.7 ); // double用
int d = max<int>( 16, 10 ); // int用
関数の中では "<" を使って二つの値を比較しています。この演算ができなければコンパイル時にエラーになります。逆に言えば、関数内にある演算や他の関数が利用できる型ならちゃんとコンパイルできるので、普通の組み込み型ではなく任意のクラスなどもテンプレート引数にしてしまうことができます。派生クラスによるポリモーフィズムは動的に変化するのに対し、コンパイル時に型が変化するので静的なポリモーフィズムと言えます。STL はテンプレートを多用しているので、STL をうまく組み合わせるといろんなことが実現できます。これがなかなかおもしろくて、最近ハマっています。
残念なのが、コンパイル時のエラーがわかりづらいこと。慣れないと対処法がわからず、慣れてきても原因がわかりにくいことが多々あります。テンプレートを利用できるのは C++ と D 言語くらいだそうで、D 言語は少し興味があるんですよね。機会があれば勉強したいところですけどね。
この記事へのトラックバックURL
http://fussy.mediacat-blog.jp/t107925
※このエントリーではブログ管理者の設定により、ブログ管理者に承認されるまでコメントは反映されません