閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

Template Metaprogramming 入門

入門記事ではなく、入門してみよう記事です。昨年から書籍やインターネットで知識だけは取り入れていましたが、しかし実際にちゃんと理解するならコードも書いていかないとわからないだろうとも思ったので、実際にやってみて、ついでにここに垂れ流してみようかと。

テンプレートメタプログラミングというのは、メタプログラミング(「プログラムを作るプログラム」を作る事)をC++のテンプレート機能を使って行うもので、概要についてはうまく説明できる自信がないので検索でもかけてもらえればと思いますが、とにかくいい加減に言ってしまえば特定の計算などを実行時ではなくコンパイル時に静的に全部やってしまおうというものです。

とりあえずは簡単なものから手をつけていこうということで、解る人には懐かしい「最大公約数を求める」プログラムを書いてみようと思います。

以下ソース。そのまんま、XとYの最大公約数を求めます。

//! 最大公約数
template
struct gcd
{
    enum
    {   // X % Y == 0 になるまで再帰呼び出しになる
        Value = gcd::Value
    };
};

// ここでストップ
template
struct gcd //< Yの値が0になると、こちらが呼ばれる
{
    enum { Value = X }; // これが最大公約数
};

int main()
{
    std::cout << gcd<33, 15>::Value << std::endl;

    return 0;
}

gcd<33, 15>::Valueはコンパイル時点で、「3」(33と15の最大公約数)に展開されます。この値は定数として扱えるので、例えば配列の添え字の数として宣言することなどもできます。

    // これは合法(コンパイルを通る)
    int array[gcd<33, 15>::Value]; // 要素数は3

あまり意味の無い例ですが、他に思いつかなかったので……。相当大雑把ですが、こういうのがテンプレートメタプログラミングを呼ばれるものです…よね? 最後に来て自信が無くなってきましたが、とまれ自分としてはまともに動かすことができたので満足です。

参考書籍。去年の夏頃買った時は何もかも理解できないことで埋め尽くされていましたが、理解できてくるとC++の深い部分に漬かれて(或いは「憑かれて」が正解かもしれない)面白いです。