ウィキペディアの例は実際には非常に単純です。
template Factorial(ulong n)
{
static if(n < 2)
const Factorial = 1;
else
const Factorial = n * Factorial!(n - 1);
}
これは同名のテンプレートです(以下のJonathanのコメントを参照してください)。n
テンプレートパラメータです。したがって、代わりに次のように書いた場合はどうなりますか。
template Factorial(ulong n)
{
if(n < 2) // NOTE: no static here
const Factorial = 1;
else
const Factorial = n * Factorial!(n - 1);
}
?- うまくいかないだろう。http://dpaste.dzfl.pl/3fe074f2を確認してください。その理由は、静的な場合と「通常」の場合のセマンティクスが異なるという事実です。コンパイル時static if
に評価される代入式(http://dlang.org/version.html、セクション「静的If」)を取りますが、通常の場合は実行時に評価される式を取ります。
Static if
Emilioが言及した「条件付きコンパイル」を実行する1つの方法にすぎません。Dにもversion
キーワードがあります。したがって、Emilioの最初の条件付きコンパイルの例(Dでは機能しません)は次のようになります。
version (XXX) {
// XXX defined
} else {
// XXX not defined
}
このために静的を使用したい場合は、次のように記述します。
enum int XXX = 10;
static if (XXX == 10) {
pragma(msg, "ten");
}