digitalmars.D.learn - generating property from structs
- Nicholas Wilson (32/32) Sep 30 2017 struct MyType
- user1234 (32/64) Sep 30 2017 You can use a struct that contains the value because apparently
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
Sep 30 2017
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.
Sep 30 2017








user1234 <user1234 12.lo>