L'esempio di Wikipedia è in realtà piuttosto semplice:
template Factorial(ulong n)
{
static if(n < 2)
const Factorial = 1;
else
const Factorial = n * Factorial!(n - 1);
}
Si tratta di un modello omonimo (Si veda il commento di Jonathan sotto). n
è il parametro del modello. Quindi, cosa succede se invece hai scritto:
template Factorial(ulong n)
{
if(n < 2) // NOTE: no static here
const Factorial = 1;
else
const Factorial = n * Factorial!(n - 1);
}
? - Non funzionerà. Controllare http://dpaste.dzfl.pl/3fe074f2. La ragione è che statico se e "normale" se ha semantica diversa. static if
accetta un'espressione di assegnazione (http://dlang.org/version.html, sezione "Statico Se") valutata al tempo di compilazione, mentre normale se accetta un'espressione valutata in fase di esecuzione.
Static if
è solo un modo per eseguire la "compilazione condizionale" menzionata da Emilio. D ha anche la parola chiave version
. Quindi, primo esempio la compilazione condizionale di Emilio (che non funziona in D) diventa qualcosa di simile:
version (XXX) {
// XXX defined
} else {
// XXX not defined
}
Se si desidera utilizzare statico se per questo, si potrebbe scrivere qualcosa di simile:
enum int XXX = 10;
static if (XXX == 10) {
pragma(msg, "ten");
}
non ha ottenuto che cosa ti aspetti, per favore, elabora il problema –
Com'è stato codificato C++? –
@R. Martinho Fernandes Da quello che so, questo è inteso come un superseed di C++ – coredump