May 29

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