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 #=> false

is_pointer!(int*).value #=> true
is_pointer!(int).value #=> false

is_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を指す