On Wednesday, 19 February 2014 at 21:50:43 UTC, Meta wrote:
On Wednesday, 19 February 2014 at 19:44:12 UTC, Meta wrote:
On Wednesday, 19 February 2014 at 19:10:44 UTC, Frustrated
wrote:
Are there container templates that one can mixin to classes
that
give them container behavior?
e.g.,
instead of
class A
{
Array!int x;
}
I want
class A
{
mixin Array!int;
}
so that I can do something like a.Add(3) instead of
a.x.Add(3).
One solution is to use alias this.
class A
{
Array!int x;
alias x this;
}
Then you can do a.Add(3) and the method call will be
"rewritten" (I don't know if it's *actually* rewritten) as
a.x.Add(3).
myints nor myfloats need to be actual elements of the class. In
fact, in this case it might be ok to override them, e.g.,
a.add(1) and a.add(5f) above.
This throws a wrench into the above solution, as you can
currently only have 1 alias this. However, your idea of inner
classes would work, I think.
I played around with it a bit at work and this is a workable
solution:
import std.container;
class A
{
this()
{
myints = new MyInts();
myfloats = new MyFloats();
}
MyInts myints;
MyFloats myfloats;
private static
{
class MyInts
{
Array!int x;
alias x this;
}
class MyFloats
{
Array!float x;
alias x this;
}
}
}
void main()
{
auto a = new A();
a.myints.insert(3);
a.myfloats.insert(3);
}
This should work. Just have to add the overrides and call the
base function(e.g., "override" insert and then call x's insert).
This at least gets the job done... I wonder if there is a better
way?