| |
|
Ali Çehreli (acehreli) 
| Tür genişletmenin bir çözümü NYP'deki türetmedir. O olanağı kullanmak istemediğine göre bunu kendin kodlamak zorundasın ve öyle de yapıyorsun zaten. Ne yazık ki D'de enum'a değer eklenemiyor. Ama D çok yetenekli olduğu için bir biçimde halledilebilir:
import std.stdio;
import std.array;
import std.traits;
import std.conv;
string değerListesi(string[] değerler...)
{
/* Burada basitçe format kullanmak isterdik ama hata veriyor:
*
* format("%(%s,%)", değerler);
*
* Error: static assert "Cannot put a char[] into a Appender!(string)"
*/
string sonuç;
if (!değerler.empty) {
sonuç ~= değerler.front;
değerler.popFront();
foreach (değer; değerler) {
sonuç ~= ',';
sonuç ~= değer;
}
}
return sonuç;
}
enum e1 {
v1, v2
}
string enumGenişlet(AsılEnum, string yeniEnum)(string[] yeniDeğerler...)
{
string sonuç = "enum " ~ yeniEnum ~ '{';
sonuç ~= değerListesi([ EnumMembers!AsılEnum ].to!(string[]));
if (!sonuç.empty) {
sonuç ~= ',';
}
sonuç ~= değerListesi(yeniDeğerler);
sonuç ~= '}';
return sonuç;
}
mixin (enumGenişlet!(e1, "e2")("v3", "v4"));
void main()
{
foreach (değer; EnumMembers!e2) {
writeln(değer);
}
}
Çıktısı:
'v1
v2
v3
v4
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
|