[Template] Mixins and foreach
Nicholas Wilson
iamthewilsonator at hotmail.com
Sun Oct 1 03:11:15 UTC 2017
On Sunday, 1 October 2017 at 02:29:57 UTC, Jonathan M Davis wrote:
> I would have thought that it would be pretty straightforward to
> just write a recursive, eponymous template to solve the problem
> and have it recursively build a single string to mix in for
> everything.
>
> In general though, without static foreach, you're either going
> to be using templates to operate in a functional manner rather
> than a procedural one, or you're going to be writing procedural
> code that generates a string to mix in. The latter doesn't
> really work though when the arguments are an AliasSeq of fields
> like you get from tupleof.
>
> This looks like it would be pretty straightforward to do with a
> recursive template though.
>
> - Jonathan M Davis
I think I've almost got it:
string generateGetInfo( /*alias*/ Info,alias func,args...)()
{
string code;
foreach(field; AliasSeq!(Info.tupleof))
{
code ~= "@property " ~ typeof(field).stringof ~ " " ~
field.stringof ~ "()" ~
"{ " ~
" typeof(return) ret;" ~
func.stringof ~ "(" ~ args.stringof ~ "," ~
__traits(getAttributes, field).stringof ~
",ret.sizeof,&ret,null);" ~
"return ret; " ~
"}";
}
}
return code;
}
struct MyType
{
void* raw;
static struct Info
{
@(42) int foo;
}
mixin(generateGetInfo!(Info,MyTypeGetInfo,raw));//errors out
pragma(msg,generateGetInfo!(Info,MyTypeGetInfo,raw)); // also
errors out
}
but this gives a bunch of
Error: need 'this' for 'foo' of type 'int'.
even with the pragma msg.
I dont see why though:
a) the Info struct is static
b) I'm only using .stringof on the _type's_ fields
c) its got the name in the errors message! it just wont let
me use it.
> The latter doesn't really work though when the arguments are an
> AliasSeq of fields like you get from tupleof.
Why is that and is that what is causing the problem here?
Thanks
Nic
More information about the Digitalmars-d-learn
mailing list