以下の階乗を計算するプログラムが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 件のコメント:
コメントを投稿