On Sun, 03 May 2015 17:21:58 +0000, filcuc wrote: > Hi all, > i'm working in the generation of the code but i'm failing in extracting > a function return type when invoking the ReturnType!(T) type trait and > mixing it with __traits(getMember) function. > Can anyone help me? or explaining what is happenning? > i've created a gist here: > https://gist.github.com/filcuc/14c3a6cac89beb69cccd > > The error message is the following: > > main.d-mixin-58(58): Error: template instance > main.Person.ReturnType!(name) does not match template declaration > ReturnType(func...) if (func.length == 1 && isCallable!func) > main.d-mixin-58(58): Error: template instance > std.traits.ReturnType!(Monitor) does not match template declaration > ReturnType(func...) if (func.length == 1 && isCallable!func) > main.d(73): Error: template instance main.IterateUDA!(Person) error > instantiating
the thing is that you mixed CTFE and runtime code in a weird way. ;-) the following works: void IterateUDA(T)() { import std.typetuple : staticIndexOf; foreach (member; __traits(allMembers, T)) { // Check that the given member is a function static if (is(typeof(__traits(getMember, T, member)))) { bool isFunction = __traits(isVirtualFunction, __traits(getMember, T, member)); if (!isFunction) continue; // Retrieve the UDA enum attributes = __traits(getAttributes, __traits(getMember, T, member)); // Extract the Function Return Type and Arguments if `Slot()` is found static if (staticIndexOf!(Slot(), attributes) >= 0) { enum returnType = ReturnType!(__traits(getMember, T, member)).stringof; import std.stdio; writeln(returnType); } } } } yet i think you need to read more about CTFE and metaprogramming, to avoid mixing different code.
signature.asc
Description: PGP signature