Container templates

Frustrated c1514843 at drdrb.com
Thu Feb 20 10:55:06 PST 2014


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?


More information about the Digitalmars-d-learn mailing list