www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Variadic Mixin/Template classes?

reply Chirs Forest <CF chrisforest.com> writes:
I'd like to make a class that takes multiple template types (1 - 
several) which can hold an array/tuple of a second class that are 
instantiated with those types.

class Bar(T) {
     T bar;
}

class Foo(T[]){ // not sure how to take variadic types here?
     Bar!(?)[] bars; //not sure how I'd define an array/tuple of 
multiple types

     this(){
         foreach(int i, b; bars) b = new Bar!T[i];
     }
}

void main(){
     auto foo = new Foo!(string, int, string, ubyte[2]);

     foo.bars[0].bar = "hello";
     foo.bars[1].bar = 23;
     foo.bars[2].bar = "hello";
     foo.bars[3].bar[0] = 88;
     foo.bars[3].bar[1] = 99;

     auto foo2 = new Foo!(ubyte, string);
     foo.bars[0].bar = 9;
     foo.bars[1].bar = "world";
}
Nov 25 2017
parent reply vit <vit vit.vit> writes:
On Saturday, 25 November 2017 at 09:52:01 UTC, Chirs Forest wrote:
 I'd like to make a class that takes multiple template types (1 
 - several) which can hold an array/tuple of a second class that 
 are instantiated with those types.

 class Bar(T) {
     T bar;
 }

 class Foo(T[]){ // not sure how to take variadic types here?
     Bar!(?)[] bars; //not sure how I'd define an array/tuple of 
 multiple types

     this(){
         foreach(int i, b; bars) b = new Bar!T[i];
     }
 }

 void main(){
     auto foo = new Foo!(string, int, string, ubyte[2]);

     foo.bars[0].bar = "hello";
     foo.bars[1].bar = 23;
     foo.bars[2].bar = "hello";
     foo.bars[3].bar[0] = 88;
     foo.bars[3].bar[1] = 99;

     auto foo2 = new Foo!(ubyte, string);
     foo.bars[0].bar = 9;
     foo.bars[1].bar = "world";
 }
import std.meta : staticMap; class Bar(T) { T bar; } class Foo(Ts...){ staticMap!(Bar, Ts) bars; this(){ static foreach(i, alias T; Ts) bars[i] = new Bar!T; } } void main(){ auto foo = new Foo!(string, int, string, ubyte[2]); foo.bars[0].bar = "hello"; foo.bars[1].bar = 23; foo.bars[2].bar = "hello"; foo.bars[3].bar[0] = 88; foo.bars[3].bar[1] = 99; auto foo2 = new Foo!(ubyte, string); foo2.bars[0].bar = 9; foo2.bars[1].bar = "world"; }
Nov 25 2017
parent Chirs Forest <CF chrisforest.com> writes:
On Saturday, 25 November 2017 at 10:08:36 UTC, vit wrote:
 On Saturday, 25 November 2017 at 09:52:01 UTC, Chirs Forest 
 wrote:
 [...]
import std.meta : staticMap; class Bar(T) { T bar; } class Foo(Ts...){ staticMap!(Bar, Ts) bars; this(){ static foreach(i, alias T; Ts) bars[i] = new Bar!T; } } void main(){ auto foo = new Foo!(string, int, string, ubyte[2]); foo.bars[0].bar = "hello"; foo.bars[1].bar = 23; foo.bars[2].bar = "hello"; foo.bars[3].bar[0] = 88; foo.bars[3].bar[1] = 99; auto foo2 = new Foo!(ubyte, string); foo2.bars[0].bar = 9; foo2.bars[1].bar = "world"; }
thankyou!
Nov 25 2017