On 2013-01-05 23:40, michaelc37 wrote:
i was trying to make a D template to mimic auto-implemented
properties in c#.

I think i got it to work but when i tried to give the template a
more meaning full name like AutoImplementedProperty i get a
compile error "a.title is not an lvalue".
Is this a bug?
Is there a more suitable way of doing this?

c# e.g:
class Bar
{
     public string Title { get; set; }
}

my attempt:
class Bar
{
     alias autoproperty!(string, "get", "set") title
}

template autoproperty(T, args...)
{
     import std.typetuple;
     @property
     {
         private T _name;
         static if (args.length)
         {
             static if (staticIndexOf!("get", args) > -1)
             {
                 public T autoproperty()
                 {
                     return _name;
                 }
             }

             static if (staticIndexOf!("set", args) > -1)
             {
                 public void autoproperty(T value)
                 {
                     _name = value;
                 }
             }

         }
     }
}

void main(string[] args)
{
     Bar a = new Bar();
     a.title = "asf";
     writefln(a.title);

     return;
}

This won't work like you think it will. All instances of "Bar" will share the same "_name" variable.

You need to use a mixin. This pass:

void main ()
{
    Bar a = new Bar();
    a.title = "asf";

    Bar b = new Bar;
    assert(b.title == a.title);
}


--
/Jacob Carlborg

Reply via email to