On Sunday, 3 May 2015 at 17:48:55 UTC, ketmar wrote:
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.


Yep sorry,
i'm still learning :)

However thank you all for your help and the quick answer.

As you suggested wrapping the body with the static if solved the problem.
I've updated the gist
https://gist.github.com/filcuc/14c3a6cac89beb69cccd

Thanks!

Reply via email to