Alıntı (zafer):
> static if yerine if kullanabiliyoruz
static if, if kullanılamadığı zamanlar için değil. if her zaman kullanılabilmelidir.
Senin yukarıdaki if'in T'nin ne olduğuna bağlı olarak sonuçta ya şuna dönüşüyor:
if (true)
{
writefln("-> %s", T.stringof);
}
Ya da şuna:
if (false)
{
writefln("-> %s", T.stringof);
}
Yani, sonuçta oluşturulan kod içinde her zaman için bir if koşulu bulunuyor ve normalde, işlev her çağrıldığında o koşul işletiliyor. Şablonun kod üretmesi ile ilgili olan o.
Tabii derleyici int için koşulun her zaman true olduğunu görüp koşul denetimini bütünüyle kaldırabilir; veya başka bir tür için her zaman false olduğunu görüp tüm bloğu kaldırabilir. Ancak, bu konu eniyileştirme ile ilgilidir if veya static if ayrımı ile ilgili değildir.
Alıntı:
> derleme zamanında işletilen kodların diğerinden farkını ayıramıyorum.
if'te koşulun derleme zamanında da bilinebileceğini ve derleyicinin belki de eniyileştirme yapabileceğini yukarıda yazdım. static if kullanıldığında ise koşulun derleme zamanında bilinmesi şarttır. Derleyici de kendisine kalmış eniyileştirmelerle uğraşmaz ve kesin bir davranışta bulunur:
Bunun farkını bir türe üye eklerken görebiliriz:
bool birKoşul()
{
return false;
}
struct S
{
int i;
static if (birKoşul()) {
double d;
}
}
void main()
{
S s;
}
birKoşul() true olduğunda S'nin hem i hem de d üyeleri bulunur. birKoşul() false olduğunda ise yalnızca i üyesi bulunur.
Aynısını if ile yapamayız çünkü türün o üyesinin olup olmayacağına derleme zamanında karar verilmiş olması şarttır.
Yukarıda görüldüğü gibi ortada şablon olması da gerekmiyor. Ama 'static if' bütünüyle Andrei Alexandrescu'nun bastırması ile ortaya çıkmış bir kavramdır. C++11'i de Going Native 2012 konferansında 'static if'i hâlâ sunmadığı için eleştirdi. Kendisi C++'ın şablon olanağını akla gelmeyecek numaralarla kullanarak 'static if'i gerçekleştirmişti. Onun Loki kütüphanesinde kullanır ve Modern C++ Design kitabında anlatır.
static if, derleyicinin kod üretimi sırasında "eğer şöyleyse şunu da ekleyelim" diyebilme olanağı verir. Phobos'ta bir çok yerde geçer. Şu bölümün hemen başında da aralıklarla nasıl yararlı olduğunu göstermişim:
http://ddili.org/ders/d/araliklar_baska.html
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]