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