Emin değilim, belki bir cevap olacak!
Eğer bu yazdıklarımı okuyorsanız cevabı henüz tam bulamamış veya anlayamamış olmalıyım. Zaten bulursam büyük ihtimalle göndermemiş olacağım, yani aşağıdakiler boşa kürek hani :)
Adım adım denemeliyim...
struct Uzun_isimli_ve_yazmak_zahmetli(T) { T i; }
alias Yeni(T) = Uzun_isimli_ve_yazmak_zahmetli!T;
Değerli Ali hocamdan en son bu yukardaki ilk örneği öğrenmiştim. Takmaadların parametre alabildiğini bilmiyordum. Bu gerçekten hayatı kolaylaştırıyor ve kullanımı basit, şu şekilde:
Yeni!int n;
assert(n.i == 0);
Eee bu da gayet basit, anlamayanı döverler :)
alias Unconst(T : const U, U) = U;
Kullanımına geçmeden, adeta bunun "Proto Template" olduğunu belirtmeliyim. Evet, bu terimi ben uydurdum çünkü bende yarattığı his bu ve gerçekten çok güzel, leziz:
alias cType = typeof(c);
Unconst!cType Int;
Int = 2;
Hayatı kolaylaştıran bir başka öğe: is
ile typeof
birleşimi. Evet, artık şablonlara girdik. Böyle bir şey zaten vardı da ben mi uydurdum onu bilmiyorum ama kullanıyorum:
alias isTypeOf = ito;
template ito(alias value)
{
alias T = typeof(value);
enum ito(U) = is(U == T);
}
Kullanmak için yakın markaja aldığım şablona (bir de kardeşi var allSatisfy) ihtiyacımız olabilir.
import std.meta : anySatisfy;
static assert(!anySatisfy!(isTypeOf!Int, ubyte, uint, ulong));
static assert(anySatisfy!(isTypeOf!Int, ubyte, int, ulong));
Yaptığı iş çok basit: İlk parametreyle sırasıyla sonraki parametreleri karşılaştırmak ve herhangi biri uyuşursa true
döndürmek. Dikkat ederseniz önceki örneklerdeki const(c)'den türeyen Int'i kullandım. İlk assert
deki ünleme (!) dikkat edin. Karşılaştırılabilecek int olmadığına göre false
döndü.
Eğer std.meta'yı incelerseniz runtime'deki bir şablona ulaşıyorsunuz kaynağı şu:
import core.internal.traits : anySatisfy;
// ve çekirdek kod bir foreach içinde:
template anySatisfy(alias F, A...)
{
static foreach(T; A)
{
static if(!is(typeof(anySatisfy) == bool) && F!T)
{
enum anySatisfy = true;
}
}
static if(!is(typeof(anySatisfy) == bool))
{
enum anySatisfy = false;
}
}
Bu kadar yeter çünkü sıkıldım :)
Soruya gelip çıkıyorum, biz sadece bunu bir döngü ile halledemez miydik? Yani bize lazım olan, foreach
içinde dönen bir static if is()
değil mi? Tıpkı Ali hocanın staticMapN()'de kodladığı gibi akıllı bir şeyler olurdu sanki!
Bu işler bir yılan gibi bu kadar uzun ve karmaşık olmamalı :)