C++のテンプレートで計算をするなんて変態だと思っていたのだけど、奥さんがさくっと10分くらいで書いたFizzBuzzのコードを見るとなんか非常に素直で読みやすいコードだったので、僕もテンプレートで何かしてみることにしました。

そんなわけでできたのが素数を求めるコード。途中の「数字を全部出す」と「2の倍数を出す」をコメントで残してあります。isPrime2とかisPrime3とかあるのは3つ合わせてisPrimeの働きをする型のそれぞれの名前を思いつかないので適当な名前になっています。テンプレートにはデフォルトの型引数があるみたいなのでisPrime本体は必要ないですね。

#include <iostream> using namespace std; template < int N, int D> struct isPrime2; template < int N, int D, int R> struct isPrime3{ isPrime3(){ isPrime2<N, D- 1 >(); } }; template < int N, int D> struct isPrime3<N, D, 0 >{ isPrime3(){ } }; template < int N, int D> struct isPrime2{ isPrime2(){ isPrime3<N, D, N%D>(); } }; template < int N> struct isPrime2<N, 1 >{ isPrime2(){ cout << N << " " ; } }; template < int N> struct isPrime{ isPrime(){ isPrime2<N, N- 1 >(); } }; template < int N> struct Numbers { Numbers(){ Numbers<N- 1 >(); isPrime<N>(); } }; template <> struct Numbers< 1 > { Numbers(){} }; int main(){ Numbers< 100 >(); }

余計なものを取り除いて名前を付け替えてアンタビファイしたやつは↓