Can you get typeof(this) in a mixin template - trying to mimic a Kotlin feature here.
Alex
sascha.orlov at gmail.com
Tue Aug 28 20:58:23 UTC 2018
On Tuesday, 28 August 2018 at 20:39:16 UTC, aliak wrote:
> Hi,
>
> I'm trying to do something similar to what Kotlin allows with
> assigning to member variables from a map. The syntax is very
> readable and looks like:
>
> class User(val map: Map<String, Any?>) {
> val name: String by map
> val age: Int by map
> }
>
> So I'm trying to do something similar in D:
>
> mixin template MapMembers(alias aa) {
> foreach (name; typeof(this).tupleof) {
> // if name is in aa, then mixin(m = aa[" ~ m ~ "]) ... ish
> }
> }
> struct User {
> this(Variant[string] aa) {
> mixin MapMembers!aa;
> }
> }
>
> Seems I can't do typeof(this) inside the mixin.
>
> One workaround is to explicitly pass the type "User" to the
> template mixin, but it feels like this is something that should
> work and I'm just unfamiliar with template mixins and their
> usage.
>
> Cheers,
> - Ali
>
> [0]
> https://kotlinlang.org/docs/reference/delegated-properties.html#storing-properties-in-a-map
Isn't the problem, that inside a template a declaration is
expected, and not a foreach?
This works as expected:
´´´
import std.experimental.all;
void main()
{
writeln("Edit source/app.d to start your project.");
}
mixin template MapMembers(alias aa) {
typeof(this) var;
/*
foreach (name; typeof(this).tupleof) {
// if name is in aa, then mixin(m = aa[" ~ m ~ "]) ... ish
}
*/
}
struct User {
this(Variant[string] aa) {
mixin MapMembers!aa;
}
}
//mixin MapMembers!(Variant[string].init);
´´´
More information about the Digitalmars-d-learn
mailing list