D言語の新たに追加されたiftype文ですけど、これは暗黙的な変換を許容します。
たとえば


template eq(A,B){
iftype(A:B){pragma(msg,"0");}
else{pragma(msg,"1");}
}
というコードを実行すると0が表示されます。
暗黙的変換を許容するって便利なことも多いけど厳密に判定したい場合もあります(よね?)
そういうときは

template eq(A,B){
iftype(A**:B**){pragma(mag,"0");}
else{pragma(msg,"1");}
}
と書きましょう。
この場合1が表示されます。
つまりポインタにすれば暗黙的変換が出来なくなるということです。
この際にA**とB**でなく、A*とB*としてしまうと、Bがvoidの時にvoid*になり
A*がどの型でも暗黙的変換が可能になってしまうのを回避するためです。


まあC++と同じようにtemplateの特殊化を使えば問題ないんですけどね。
D言語ではtemplateの特殊化なら暗黙的変換は利きませんし。
でも新しい機能を使ってみたかったので書いてみました