October 09, 2022

Merhaba,

D'nin derleme zamanında sahip olduğu türlü şablonlar öyle güzel tasarlanmış ki hayal edin yeter, sanki her şey mümkün! Hele ki mixin(katmaları) işin içine kattığınızda "ne oluyor burda" diye şaşkınlıktan küçük dilinizi yutabilir ya da sadece yutkunarak kendinizi toparlamaya çalışabilirsiniz. Şimdi denediğim basit bir şey aslında yutkunacak bir şey yok :)

Şurada başlayan bir tartışmada D'nin şu an ki olanakları ile şöyle bir kullanım mümkün:

void main()
{
  // #1
  with(new Point!ushort())
  {
    x(10);
    y(11);
    assert(points == 0x000A000B);
  }
  // #2
  with(new Point!ushort())
  {
    xy(10, 11);
    assert(points == 0x000A000B);
  }
  // #3
  with(new Point!ushort())
  {
    x(10, 11);
    assert(points == 0x000A000B);
  }
  // #4
  with(new Point!ushort())
  {
    y(10, 11);
    assert(points == 0x000A000B);
  }
}

Elbette 3 ve 4 ütopik çünkü alias xy = y; ile zaten çiftli kullanım mümkün. Ama static if'leri kaldırıp 3. bir işlev ekleyerek herkes kendi görevini yapmalı. Yapmazsa ne olur, sınırılar nelerdir, işte o yapı şöyle bir şeydir:

union Point(T)
{
  uint points;
  T[2] p;

  @property x(Coords...)(Coords coords)
  {
    static if(coords.length)
    {
      static if(coords.length == 2)
      {

        p[0] = cast(T)coords[1];

      }

      return p[1] = cast(T)coords[0];

    } else {

      return p[1];

    }
  }

  alias xy = y;

  @property y(Coords...)(Coords coords)
  {
    static if(coords.length)
    {
      static if(coords.length == 2)
      {

        p[1] = cast(T)coords[0];
        return p[0] = cast(T)coords[1];

      } else {

        return p[0] = cast(T)coords[0];

      }

    } else {

      return p[0];

    }
  }
 }

@SDB79