コンパイル時リスト処理
前回の日記からコード整理してみました。
ソースはこちら
前のコードだと二重mapが実現できなかった(というか実現するためにmapの中身をそのたびに書き換えないといけなかった)んですが、こちらの「テンプレート引数にクラステンプレートを渡す話」みてできそうだったのでやってみました。
しかし今までそれなりの数のC++関連の本読んできてるはずなのにテンプレートクラスを引数に渡せることを知りませんでした・・・いや、載ってるのを見てはいたけど記憶に残ってないだけだとおもいますが。
template <typename T> struct generate_multiply_table { typedef bind_1st<multiply,T> curryed_type; typedef typename map_list< curryed_type::currying_type, iota<10,1>::type>::type type; };
なお、今回のコードはMinGW g++ 3.4.5とMinGW g++ 4.2.1 dwarf2 EHではコンパイルできませんでした。
bind_1stで、curry化してるんですが、curry化した型をテンプレート型を受け取るテンプレート引数にした場合にコンパイルエラーになります(上のコードの場合、curryed_type::currying_typeをmap_listに渡している部分)。
Visual Studio .Net 2008 Express Editionだと通りましたが要素数を多くするとさくっとコンパイラが落ちてくれやがるので実用できそうにありません。
g++でもネスト深いとコンパイル時間がどんどん増えていってたので上の構文がg++でとおったとしても256 * 256要素のテーブルとかこれで作れるのかは不明です・・・