维基百科的例子其实很简单:
template Factorial(ulong n)
{
static if(n < 2)
const Factorial = 1;
else
const Factorial = n * Factorial!(n - 1);
}
它是一个同名模板(参见下面乔纳森的评论)。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。原因是静态 if 和“正常” if 具有不同的语义。采用在编译时static if
评估的赋值表达式(http://dlang.org/version.html,“Static If”部分),而普通 if 采用在运行时评估的表达式。
Static if
只是执行 Emilio 提到的“条件编译”的一种方法。D 也有version
关键字。所以 Emilio 的第一个条件编译示例(在 D 中不起作用)变成了这样:
version (XXX) {
// XXX defined
} else {
// XXX not defined
}
如果您想为此使用 static if,您可以编写如下内容:
enum int XXX = 10;
static if (XXX == 10) {
pragma(msg, "ten");
}