[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ども・・・・・・・・・・・・・・・・・・GES会長の和佐田雅史です。
今日は新世界の技術と呼ばれているtemplateMetaProgrammingについてです。
少し前にGenericProgrammingについて触れましたが、それの応用です。
GenericProgrammingは型引数というものを持ち、型に依存しない素晴らしいプログラムが組めるというものでした。
// ラジアン
template< typename T > inline T Radian( T Degree )
{
return static_cast< T >( PI/180.0f)*Degree;
}
このようにするとT型へ勝手にラジアン変換してくれる便利なユーティリティの出来上がりです。
float Angle = Radian< float >( 60.0f );
double Angle = Radian< double >( 60.0f );
のように型引数で指定すると勝手に展開されて、その関数を構築してくれます。
※実際はstatic const float Radian = PI/180.0f;と置いて手動で変換する方が遥かに速いですが。
しかしtemplateで渡せるのはclassや、typenameだけではありません。
int、unsigned( unsigned int )、long等と言った整数値も型として渡すことが可能です。
( VisualC++ 6.0コンパイラならdouble等も渡せます。 )
これを利用しない手はありません。
これを利用すれば、コンパイル時に型生成だけで数値演算を行うことも可能です。
以下を踏まえて階乗を計算するtemplateを実装してみます。
// 階乗計算templateMeta
template< unsigned N > struct Fact
{
enum { Val = N * Fact< N - 1 >::Val };
};
// template特殊化 : 0か1の階乗の場合
template <> struct Fact< 0 > { enum { Val = 1 }; };
template <> struct Fact< 1 > { enum { Val = 1 }; };
// 分りにくい人の為にマクロで呼びさせるに定義
#define FactT( n ) Fact< n >::Val
0の階乗や1の階乗は1なので予めtemplateの特殊化をしておきます。
templateの特殊化とは、この型の場合はこういう動きをするというものを定義する機能です。
Fact( 3 );
とすると3の階乗をコンパイル時に型として生成し、実行時には既に求まっているものとなります。
必ずしも必要な技術では無いですが、学生にして神の領域に挑みたい方はどうぞ。
templateMetaに関しては、boostやLokiというライブラリを解析すれば結構勉強になります。
最もそれらが理解出来るのならば学校に来る必要等無いですが・・・・・・・・・・・・。
それではお疲れ様でした。
COMMENT