2014年9月8日月曜日

テンプレートメタプログラミングが難しい

Effective C++を読んでいたら最後の法でテンプレートメタプログラミング(TMP)というのが出てきました。

以下の階乗を計算するプログラムがTMPの初歩的なプログラムらしいです。

#include <iostream>

template<unsigned n>
struct  Factorial {
    enum { value = n * Factorial<n - 1>::value };
};

template<>
struct  Factorial<0> {
    enum { value = 1 };
};

int main()
{
    std::cout << Factorial<5>::value << std::endl;
    std::cout << Factorial<10>::value << std::endl;
    getchar();

}

このコードを見てよくわからなかったのは

・enumってなんか意味あるの?
・Factorialっていつ計算されるの?

でした。

enumってなんか意味あるの? 

enumハックというやつらしいです。コンパイル時にクラス内で定数が必要になるときに使うそうです。

static const unsigned value = n * Factorial<n - 1>::value;

と書いても動きましたが、こっちはコンパイラによってはエラーになるらしい。

Factorialっていつ計算されるの?

コンパイル時にされる。普通に本文に書いてあったのですが、文章ってあまり頭に入ってこないですね。コード見たときになんやこれ、って思って悩んでしまいました。
TMPでは、このような静的な計算がコンパイル時に行われるため、計算が高速化するらしいです。


ほかにTMPの効用としては

エラーがコンパイル時にみつかる

たとえば Factorial<20> とかにすると値が大きくなりすぎてエラーをはく

TMPはチューリング完全であることが証明されている

要はどんな計算でもTMPで書けることが保障されているらしい・・・



しかし、実際どうやってTMPで書いていったらいいかわからんです


0 件のコメント:

コメントを投稿