On Wednesday, 27 December 2017 at 20:54:17 UTC, bitwise wrote:
On Wednesday, 27 December 2017 at 20:04:29 UTC, Marc wrote:
I'd like to set the members of a class by its name at runtime, I would do something like this:

__traits(getMember, myClass, name) = value;

but since name is only know at runtime, I can't use __traits(). What's a workaround for this?

I think you could write something using a combination of these two things:

https://dlang.org/phobos/std_traits.html#FieldNameTuple
https://dlang.org/phobos/std_traits.html#Fields

or maybe '.tupleof':

https://dlang.org/spec/struct.html#struct_properties

there's also a simple workaround for fields with the same type: https://run.dlang.io/is/dsFajq

import std.stdio;

struct S {
  int x;
  int y;
}

auto setValue(ref S s, string field, int value) {
  foreach (fieldName; __traits(allMembers, S)) {
    if (fieldName == field) {
      __traits(getMember, s, fieldName) = value;
      break;
    }
  }
}

void main() {
  S s;
  s.setValue("x", 5);
  s.setValue("y", 25);
  writeln(s);
}


you can play with it to make it more generic. you can also create a mixin template that would generate setters for each field you would need a setter for and then in the run time you'd just be able to call them.

Reply via email to