Merhaba,
Bugün biraz okuma yapıyorum (bu arada 100. yıl, 30 Ağustos Zafer bayramımızı tebrik ederim)..
Adam D.Ruppe'nin D Cookbook kitabının "Extending the runtime type information" başlığında (sayfa 219) güzel bir uygulama dikkatimi çekti. Her ne kadar ileri seviye olsa da Çoşkun'nun auto
ve türler üzerine araştırmasına katkı sağlayabilir. Çünkü türleri sadece kullanmak yetmiyor, kendi türleriniz üzerinde de, olabildiğince ve ustaca tarzanlık yapmak gerekebilir:
İşte (kendi sadeleştirmem ile) ustaca tarzanlık:
MoreInfo birBak(T)(T t) {
if (auto ptr = typeid(t) in moreTypeInfo)
return *ptr;
return null;
}
MoreInfo birBak(T)() {
if (auto ptr = typeid(T) in moreTypeInfo)
return *ptr;
return null;
}
interface MoreInfo {
bool birSayı_Mı();
string ptrVer_strAl(in void*);
}
class MoreInfoImpl(T) : MoreInfo {
import trait = std.traits;
bool birSayı_Mı() {
return trait.isIntegral!T;
}
string ptrVer_strAl(in void* ptr) {
import std.conv;
auto t = cast(T*) ptr;
return to!string(*t);
}
}
Aslında bu kodları yarı yarıya düşürdüm içinde işleri kolaylaştırıcı mixin template EnableMoreInfo(types...)
vardı. Ancak kodu tam okuyabilmek için ona ihtiyaç duymadan kendi AA'mı liste halinde ekleyebilmek istedim. Yani şöyle:
MoreInfo[TypeInfo] moreTypeInfo;
static this() {
moreTypeInfo[typeid(int)] = new MoreInfoImpl!int();
moreTypeInfo[typeid(Foo)] = new MoreInfoImpl!Foo();
}
// şimdi kendi türümüzü oluşturup deneyelim:
class Foo
{
override string toString() { return "Bu bir Foo Class"; }
}
import std.conv, std.traits;
void main()
{
int a = 34;
Foo foo = new Foo;
import std.stdio;
/** örnek-1 **/
isIntegral!(typeof(a)).writeln(": doğrudan, yansıma yok");
birBak(a).birSayı_Mı.writeln(); // true
isIntegral!Foo.writeln(": doğrudan, yansıma yok");
birBak!(Foo).birSayı_Mı.writeln(); // false
/** örnek-2 **/
a.to!string.writeln;
auto str1 = birBak(a).ptrVer_strAl(&a);
typeof(str1).stringof.writeln(": ", str1);
foo.to!string.writeln;
auto str2 = birBak(foo).ptrVer_strAl(&foo);
typeof(str2).stringof.writeln(": ", str2);
}
Çıktısı ise lüzumsuz ama siz de deneyin belki daha lüzumlu örnekler ile doldurabilirsiniz:
>true: doğrudan, yansıma yok
true
false: doğrudan, yansıma yok
false
34
string: 34
Bu bir Foo Class
string: Bu bir Foo Class
Gerçekten güzel ve etkilici değil mi? Tabi bu etkileyicilik D'den geliyor o başka :)
Başarılar...