Przykład Wikipedia jest rzeczywiście bardzo prosty:
template Factorial(ulong n)
{
static if(n < 2)
const Factorial = 1;
else
const Factorial = n * Factorial!(n - 1);
}
Jest to tytułowa szablon (patrz komentarz Jonathana poniżej). n
jest parametrem szablonu. A więc, jeśli zamiast tego napisałeś:
template Factorial(ulong n)
{
if(n < 2) // NOTE: no static here
const Factorial = 1;
else
const Factorial = n * Factorial!(n - 1);
}
? - To nie zadziała. Sprawdź http://dpaste.dzfl.pl/3fe074f2. Powodem jest fakt, że statyczne jeśli i "normalne", jeśli mają inną semantykę. static if
przyjmuje wyrażenie przypisania (http://dlang.org/version.html, sekcja "Statyczne, jeśli"), które jest oceniane przy czasie kompilacji, natomiast normalne, jeśli przyjmuje wyrażenie, które jest oceniane w czasie wykonywania.
Static if
to tylko jeden ze sposobów na "kompilację warunkową" wspomnianą przez Emilio. D ma również słowo kluczowe version
. Więc pierwszy warunkowy przykład kompilacja Emilia (który nie działa w D) staje się coś takiego:
version (XXX) {
// XXX defined
} else {
// XXX not defined
}
Jeśli chcesz użyć statycznego czy do tego, by napisać coś takiego:
enum int XXX = 10;
static if (XXX == 10) {
pragma(msg, "ten");
}
nie dostać czego tak naprawdę oczekujesz, proszę rozwiąż problem. –
W jaki sposób jest to równoznaczne z C++? –
@R. Martinho Fernandes Z tego, co wiem, jest to zamierzone jako superseed z C++ – coredump