D言語でテンプレートメタプログラミング
最近はD言語によるテンプレートメタプログラミングがマイブームですよ。
まあ始めたばかりなんで習作しか作ってないけど。
template factorial(int I : 0){
enum { factorial = 1 }
}template factorial(int I){
enum { factorial = I * .factorial!(I - 1) }
}
factorial!(8) #=> 40320 *1
boost/type_traitsもどき。
is_same!(int, int).value #=> true
is_same!(int, char).value #=> falseis_pointer!(int*).value #=> true
is_pointer!(int).value #=> falseis_array!(int[]).value #=> true
is_array!(int).value #=> false
boost/mpl/arithmeticもどき。
plus!(int_!(20), int_!(10)).value #=> 30
minus!(int_!(20), int_!(10)).value #=> 10
multiplies!(int_!(20), int_!(10)).value #=> 200
devides!(int_!(20), int_!(10)).value #=> 2
boostのmpl/listやLokiのTypeListのようなもの。
alias TypeList!(bit, byte, short, int, long) TL_5; // 型のリストを保持するユーザ定義型
size!(TL_5).value #=> 5
at!(TL_5, 0).type #=> bit型
at!(TL_5, 3).type #=> int型
C/C++の#defineが撤廃されてるので多引数のタイプリストの定義が面倒。まあしかたないね。
ところで、boost/mplのソースをちょこっと見てみたけどなんだありゃ。
意図的にスクランブルかけてるんじゃあるまいかと思ってしまった。
*1:この例の場合、テンプレートfactorialは同名のメンバ一つしか持たないのでfactorial!(8)はfactorial!(8).factorialを指す