Alıntı (zekeriyadurmus):
> bu fonksiyonun aldığı parametrenin kontrolünü compile time yapmak istiyoruz. Bunu yapmanın bir yolu var mı?
Bunun için en az üç yol var. Derleme zamanında yapıldığını ispatlamak için yalnızca derleme zamanında işlediğini bildiğimiz 'static assert''lerden yararlanacağım.
- enum olarak işaretlenmiş olan değişkenler derleme zamanında hesaplanırlar. Dolayısıyla değişkeni enum olarak işaretlemek yeterli. (Bu, D'nin hemen hemen her işlevi derleme zamanında işletebilmesinin bir sonucudur. Yani, CTFE'nin.)
enum olarak işaretlenmiş bir değişken bir hazır değerdir (manifest constant). O yüzden dereleme zamanında hesaplanır.
- Değişkeni 'static const' olarak işaretlemek.
Böyle bir değişkenin enum değişkenden farkı, adresinin alınabilir gerçek bir değişken olmasıdır (yani, sağ değerdir (lvalue)). enum ise daha çok C'nin makroları gibi, kullanıldığı her yere tekrar yazılan bir değer gibidir. Örneğin, aşağıdaki kodda sonuç0'ın adresi alınamaz ama sonuç1'in alınabilir.
- İşlev şablonu kullanmak. Şablon parametreleri derleme zamanında bilinmek zorunda olduklarından aşağıdaki örnek senin test işlevini bir şablon içinden çağırıyor.
Bunların üçü de aşağıdaki kodda var:
import std.stdio;
enum y{
a, b, c, d
}
int test(y x = y.a){
if(x == y.a){
return 10;
}else if(x == y.b){
return 20;
}else if(x == y.c){
return 30;
}else if(x == y.d){
return 40;
}
assert(false);
}
int test_derleme_zamanı(y değer)(/* ... gerekiyorsa başka parametreler ... */)
{
return test(değer);
}
int main(string[] argv){
enum sonuç0 = test();
static assert(sonuç0 == 10);
static const sonuç1 = test(y.b);
static assert(sonuç1 == 20);
static assert(test_derleme_zamanı!(y.c)(/* ... */) == 30);
return 0;
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]