Alıntı (zekeriyadurmus):
>
> void x(T : T[])(T[] arr){
> }
> ```
Öyle yazınca sanki tanımda bir sonsuzluk var: "sana T dilimi vereceğim; öyle ki, her elemanı bir T[] olsun." Yani T dilimi dilimi dilimi... gibi...
Bunu parametreye bakarak görebiliriz: string verdiğimizde ilk bakışta T'nin immutable(char) olması gerekiyor gibi görünüyor ama şablon parametre listesine uymuyor çünkü immutable(char) kendisi bir immutable(char)[] değil.
Yukarıdaki açıklamaya en uygun çözüm şu:
void x(T)(T[] arr){
}
O durumda T'nin türü immutable(char) olarak çıkarsanır.
Başka çözüm, işlev parametresini T olarak bırakmak ama şablon parametresinde onun başka bir türün dilimi olduğunu söylemek:
void x(T : U[], U)(T arr){
}
Anlamı: "Sana bir tür vereceğiz; öyle ki, U[] dilimine uysun; U bir türdür."
Veya, şablon kısıtlaması ile:
import std.traits;
void x(T)(T arr)
if (isSomeString!T)
{}
Veya, yine baştaki gibi düşünüp işlev parametresini dilim gibi yazarsak:
import std.traits;
void x(T)(T[] arr)
if (isSomeChar!T)
{}
Ama tabii önceki örneklerden bazılarında da olduğu gibi, bu son örnekte T bir karakter türü olduğundan bu sefer senin son çağrı derlenmez:
x!string("qwe"); // derleme hatası
çünkü T bir string değil, bir string elemanı.
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]