Any way to reproduce Dart style constructors?
ag0aep6g via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu May 25 04:31:43 PDT 2017
On 05/25/2017 12:52 PM, Moritz Maxeiner wrote:
> Be aware, though, that constructors mixed in via a mixin template behave
> differently with regards to overloading[1].
>
> [1] https://issues.dlang.org/show_bug.cgi?id=11500
Of course it couldn't be that simple :(
Adam's workaround (`alias __ctor = mixin_thing.__ctor;`) might be
workable, though.
If that makes the usage too verbose, then a string mixin is the way to
go, I guess. It's immune to issue 11500, but AutoConstructor isn't as
nice to look at:
----
static string AutoConstructor(fields ...)()
{
import std.meta: staticMap;
import std.traits: fullyQualifiedName;
import std.string: join;
enum fqns = staticMap!(fullyQualifiedName, fields);
auto fields_str = "std.meta.AliasSeq!(" ~ [fqns].join(", ") ~ ")";
return "
static import std.meta;
this(typeof(" ~ fields_str ~ ") args)
{
" ~ fields_str ~ " = args;
}
";
}
class Person
{
string name;
int age;
mixin(AutoConstructor!(age, name));
this(float f) {}
}
void main()
{
auto p = new Person(42, "Arthur");
assert(p.age == 42);
assert(p.name == "Arthur");
}
----
Weird: AutoConstructor needs to be static. Doesn't make sense to me.
Looks like a compiler bug.
More information about the Digitalmars-d-learn
mailing list