Basit bir şey aslında...:)
Enum'lar ile bu kadar çok içli dışlı olunca; açıklamlarını bölerek yapacağım şu örnekteki tekniği geliştirdim. Aslında bir süredir isimsiz enum'lar ile yazılımın en başına oluşturduğum bu kümede, bir çok sabite yer veriyordum. Örneğin yazılımın ismi, test süreçlerinde kullanılacak parametreler vb. bir çok öğe (hesap&kitap) burada bulunuyordu...
Şimdi ise bunu, tür şablonunu kullanarak sınıf aktarmayı denedim. Pekala güzelce çalışıyor:
import std.stdio;
import std.traits;
class BirSınıf(E)
if( is(E == enum) ) {
static assert(isUnsigned!E, "\n\tKULLANILMASI GEREKENLER:\n"
"\tubyte, ushort, uint, ulong\n");
BirYapı[] kütük;
string kütükAdı;
string sınıfAdı;
this(string kütük, string sınıf) {
this.kütük = new BirYapı[](E.adet);
this.kütükAdı = kütük;
this.sınıfAdı = sınıf;
}
void ekle(size_t nm, string ad) {
this.kütük[nm].numarası = E.numBaş + nm;
this.kütük[nm].adı = ad;
this.kütük[nm].sınıfı = this.sınıfAdı;
}
override string toString() const {
string lines = std.array.replicate("=", 30);
string çıktı = kütükAdı ~ " - " ~
sınıfAdı ~ " öğrencileri:\n";
çıktı ~= lines ~ "\n";
if(E.test) return format("%(%s\n%)", kütük);
else foreach(i, öğrenci; kütük) {
if(i%E.xSütun == 0 && i != 0) çıktı ~= "\n";
çıktı ~= format("(%d) %s\t", öğrenci.numarası,
öğrenci.adı);
}
return çıktı ~ "\n" ~ lines;
}
}
struct BirYapı {
size_t numarası;
string adı;
string sınıfı;
}
/* Statik(belirli) bir veri kaynağından,
* 4 öğrenci ismi geleceğini düşünelim:
*/
string[4] öğrencilerim;
void main() {
/*************** LİSTELEME PARAMETRELERİ ***************/
enum p1 : size_t {
//test = 1,/*
test,//* ^-- Programcı görünümü için aç */
adet = öğrencilerim.length,
numBaş = 100,
xSütun = 2
}
/*************** LİSTELEME PARAMETRELERİ ***************/
öğrencilerim = [ "Ahmet", "Ali", "Ayşe", "Azra" ];
/* Bu veriler ODTÜ öğrencilerinin, FEN1B sınıfının
* isimleri olduğunu işlevsel sınıfımıza bildirelim:
*/
auto FEN1B = new BirSınıf!p1("ODTÜ", "FEN1B");
/* DİKKAT:
* Biz listeme parametreleri (p1) sayesinde, gereksiz yere
* kütük açmadan veri uzunluğunu da bildirmiş olduk!
*/
foreach(i, öğrenci; öğrencilerim) {
FEN1B.ekle(i, öğrenci);
öğrenci.write(", eklendi...");
}
"\n".writeln;
FEN1B.writeln;
} /*Çıktısı:
Ahmet eklendi...Ali eklendi...Ayşe eklendi...Azra eklendi...
ODTÜ - FEN1B öğrencileri:
==============================
(100) Ahmet (101) Ali
(102) Ayşe (103) Azra
==============================
*/
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]