Merhaba,
Hepimiz enum'ları biliriz; D'yi tanımayan yeni arkadaşlar için kışkırtıcı bir cümle:
"D'nin ne kadar güçlü bir dil olduğunu bilmiyorsun, öğren lütfen!"
2 sene önceyiz Karamelize Soğan, Tereyağlı ve Rokforlu 200 gr. Hamburger başlığı atmışım. Şimdi paylaşacağım çok benziyor ama bu kadar yüksek kalorili değil :)
struct Flags(T)
{
import std.typecons : BitFlags;
BitFlags!(E, Yes.unsafe) flags;
alias flags this;
bool opDispatch(string name)() const
if (__traits(hasMember, E, name))
{
enum e = __traits(getMember, E, name);
return cast(int)(flags & e) != 0;
}
void opDispatch(string name)(bool set)
if (__traits(hasMember, E, name))
{
enum e = __traits(getMember, E, name);
if (set) flags |= e;
else flags &= ~e;
}
}
Evet, bu std.typecons'dan bir yapı (BitFlags) ve Trabzon Ekmeği kadar babacan bir olanak. Siz üzerine tereyağ sürüp kalorisini arttıracağız. Bunu kütüphanenize koydunuz var sayın ve yanına bir enum gazozu açıp şöyle kullanıverin:
import std.stdio;
void main()
{
enum KeyMod
{
None,
LCtrl = 1 << 0,
RCtrl = 1 << 1,
Ctrl = LCtrl | RCtrl,
}
Flags!KeyMod keys;
keys.RCtrl = true;
assert(keys.RCtrl);
}
Güzel ama değil mi!
SDB@79