On Thursday, 20 March 2014 at 16:28:46 UTC, Chris wrote:
How can I instantiate Person with Trait, i.e. a template with a template?

struct Trait(T0, T1) {
  T0 name;
  T1 value;
  T1[T0] map;

  this(T0 name, T1 value) {
    this.name = name;
    this.value = value;
    map[name] = value;
  }
}

class Person(T) {
  T traits[];

  void addTrait(T trait) {
    traits ~= trait;
  }
}


void main()
{
  auto trait1 = Trait!(string, string)("Name", "John");
  auto trait2 = Trait!(string, int)("Age", 42);
  writefln(%s", trait1.map);
  writefln(%s", trait2.map);
  // above code compiles and works
}

Person!(Trait!(string, string)) person;

-- or --

alias MyTrait = Trait!(string, string);
Person!MyTrait person;

Note that this approach won't let you have traits with different parameters within the same Person type.

Reply via email to