September 30, 2017 generating @property from structs | ||||
---|---|---|---|---|
| ||||
struct MyType { void* ptr; static struct Info { @(42) int foo; } // Should be generated by the mixin below @property int foo() { int ret; getMyTypeInfo(ptr,42,int.sizeof,&ret); return ret; } mixin generateInfo!getMyTypeInfo; } extern(C) void getMyTypeInfo(void*,int, size_t,void*); How do I write generateInfo info? mixin template generateInfo(alias func) { foreach(field; typeof(this).Info.tupleof) { //??? } } I know I'll probably have to resort to string mixins, but how do I get the attribute so that I call func(ptr,attibute, T.sizeof, &ret)? There will be a couple of values that dont have an attribute but they are all of known types and I want to handle them separately. Thanks Nic |
September 30, 2017 Re: generating @property from structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | On Saturday, 30 September 2017 at 08:20:44 UTC, Nicholas Wilson wrote: > struct MyType > { > void* ptr; > static struct Info > { > @(42) int foo; > } > > // Should be generated by the mixin below > @property int foo() > { > int ret; > getMyTypeInfo(ptr,42,int.sizeof,&ret); > return ret; > } > mixin generateInfo!getMyTypeInfo; > } > > extern(C) void getMyTypeInfo(void*,int, size_t,void*); > > How do I write generateInfo info? > > mixin template generateInfo(alias func) > { > foreach(field; typeof(this).Info.tupleof) > { > //??? > } > } > > I know I'll probably have to resort to string mixins, but how do I get the attribute so that I call > func(ptr,attibute, T.sizeof, &ret)? There will be a couple of values that dont have an attribute but they are all of known types and I want to handle them separately. > > Thanks > Nic You can use a struct that contains the value because apparently without you can only retrieve a specific value: --- struct ValueHolder{int value;} struct Foo { @ValueHolder(42) int foo; int getTheValueDuringTheCall(string member)() { import std.traits; alias uda = getUDAs!(__traits(getMember, Foo, member), ValueHolder); static if (uda.length == 1) return uda[0].value; else return 0; } void test() { import std.stdio; writeln(getTheValueDuringTheCall!"foo"); } } void main() { Foo foo; foo.test(); } --- I mean that `getUDAs!(__traits(getMember, Foo, member), int);` wouldn't work. |
Copyright © 1999-2021 by the D Language Foundation