Bu da çok leziz görünüyor, teşekkürler. Ancak dikkat edersen şablon kullanımından vazgeçtim. Çünkü farklı türleri aynı anda taşıyamıyorum. Bilemiyorum, belki de çokuz olaylarına girmenin vakti gelmiştir. Peki çokuzlar, derleme anındaki şablon olanaklarından değil mi? Sanki bir ara yapmaya (kırmaya) çalıştığımız, dizi içinde dizi (farklı tür) çıkmazına girdim yine...:)
Yine de son yapıyı her halükarda denemeliydim. Şu kodların bir ekran görüntüsünü aldım:
void main() {
auto t = Tx(0x12345678);
writefln("%(0x%02x %)", t.parçalar);
t.Tür değişken;
"Yapının gerçekteki aldığı ismi: ".writeln(typeid(t));
"Yeniden oluşturulan değişken : ".writeln(typeid(değişken));
auto başkaBirTür = Tx('A');
"Aynı yapının başka türü: ".writeln(typeid(başkaBirTür));
}
Alıntı (ÇIKTISI):
> 0x78 0x56 0x34 0x12
Yapının gerçekteki aldığı ismi: rasgeleveri.Tx!(int).Tx
Yeniden oluşturulan değişken : int
Aynı yapının başka türü: rasgeleveri.Tx!(char).Tx
Yukarıda görüldüğü gibi, şablon ile birlikte gelen tür isminden dolayı; aynı kapta durması tehlikeli gazlar gibi (yanıcı/yakıcı) illegal bir durum oluşturuyor. Zaten bu başlıkta işlemeye/aşmaya çalıştığım sorun da bu. Sanki aştım gibi!
Şöyle bir test kodumuz olsun:
import std.stdio, std.random, sdb.utype; /* <-- utype modülü bulunmayanlar,
yukarıda son naklettiğim Tx yapısını aynı dosyada kullanabilirler... */
char rasgeleSeç(string seçenekler) {
auto rasgeleSayı = uniform(0, size_t.max);
auto aralıkOranı = size_t.max / seçenekler.length;
size_t biriniSeç = rasgeleSayı / aralıkOranı;
return seçenekler[biriniSeç];
}
auto rasgeleTür(size_t adedi) {
Tx[] sonuç;
while(adedi--) {
final switch(rasgeleSeç("LISB")) {
case 'L': ulong s7 = uniform(ulong.min, ulong.max);
sonuç ~= Tx(s7); break;
case 'I': uint s5 = uniform(uint.min, uint.max);
sonuç ~= Tx(s5); break;
case 'S': ushort s3 = uniform(ushort.min, ushort.max);
sonuç ~= Tx(s3); break;
case 'B': ubyte s1 = uniform(ubyte.min, ubyte.max);
sonuç ~= Tx(s1); break;
}
}
return sonuç;
}
void main() {
foreach(r; rasgeleTür(3)) {
r.veri.data.writeln(": ", r.tür);
}
}
Alıntı (ÇIKTISI):
> 1539812105: uint
17258: ushort
1025021539: uint
Anlaşılacağı üzere, artık Tx'in taşıcılığında farklı türden verileri bir işleve sokabilir veya çıkarabilirim. Ancak bu türün içindeki veriyi basit bir eşitleme ile uyumlu olduğu türe aktaramıyorum. Her ne kadar TypeInfo sınıfını kullanmış olsam da, döndürdüğü türün ismi aslında bir dizge ya da ben bir şeyleri yanlış yapıyorum... :scared:
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]