これは、1月20日に北海道にて行われた日本野望の会で披露したネタのまとめと解説のエントリーです。

そもそも

こんなしょーもないネタを思いついたのは、このブログの昨年の検索キーワードトップ3が

だったから。それぞれのキーワードについては、

あたりを見てちょうだい。

特に、会場には「テンプレートって知らなーい」って人が2,3人いたのでテンプレートについてちゃんと説明したかったのですが、いかんせん時間が足りなすぎでした。テンプレートをまじめに語ると本が一冊書けてしまうので、端折りました。当然、ここでも端折ります。

上述のリンク先とかを見るか、テンプレートをまじめに語った本を一冊読んでくだせえ。

とりあえず、おいらのFizzBuzzコードwithC++テンプレートを読むに当たって、次の点だけでもおさえておくと理解が早く進むかも。

操作すべき対象は型（クラス,構造体etc...）であり、クラス（構造体）テンプレートは関数である たとえば、f(x,y)=G(P(x),Q(y))な関数は次のように書けます。 template < class X, class Y> struct F { typedef Q<Y> q; typedef typename G<P<X>, q>::ev ev; }; ev*1というtypedefされたメンバ型があるけど、これを参照するとテンプレートがインスタンス化されます。このテンプレートのインスタンス化は即ち関数Fの評価に相当し、インスタンスが評価値となります。テンプレートは実際に使うまでインスタンス化されないので、evを参照するタイミングを適切に設定すると、遅延評価もできます。 部分特殊化(partial specialize)を使うと分岐が書ける 部分特殊化とはなんぞやという解説はしません。とりあえず次のコードを見てください。 template < class C, class E1, class E2> struct IF { typedef typename E1::ev ev; }; template < class E1, class E2> struct IF<FALSE, E1, E2> { typedef typename E2::ev ev; }; この定義に対し、 IF<foo,T1,T2>::ev としたとき、fooがFALSE以外だとT1の評価値が、FALSEだとT2の評価値がIF の評価値になるのね。これはまさに分岐。実際の実装にはもうワンクッションの工夫が必要だけど、とりあえずそれは実コードを見てもらえればいいです。

さて、C++はオブジェクト指向言語ですが、ここでやっていることは関数プログラミングです。Lispとかでのプログラミング経験があるとかなり有利！

ついでに言うと、C++テンプレートはチューリング完全であることが分かっているので、理論上は全てのアルゴリズムが計算可能なのです*2。

さて、これを踏まえてFizzBuzzをやります。