On Friday, 12 July 2013 at 06:38:54 UTC, Jacob Carlborg wrote:
On 2013-07-12 00:45, JS wrote:

I believe the issue is that isFinalFunction requires an actual function
symbol but I'm passing it a string?


How can I get this to work?

Have you tried using a mixin?

__traits(isFinalFunction, mixin(className ~ "." ~ member));

The issue is with the template being in a different module. Same code works fine when in the same module...


module main;
import std.stdio, std.cstream, std.conv, std.traits, testmodule;

template test(alias i)
{
        alias typeof(i) I;
        static string eval()
        {
                enum name = "foo";
                //enum qname = moduleName!(I)~"."~I.stringof~"."~name;
                enum qname = I.stringof~"."~name;
                pragma(msg, "main: "~qname);
                return (__traits(isFinalFunction, mixin(qname))).stringof;
        }
        enum test = eval();
        pragma(msg, "main: isfinal: "~test);
}
interface A
{

        final void foo() { };
        void foo(int x);
}


int main(string[] argv)
{
        A a;
        writeln(mixin(test!(a)));
        writeln(mixin(test2!(a)));
        din.getc();
        return 0;
}



testmodule.d:
module testmodule;
import std.traits;


template test2(alias i)
{
        alias typeof(i) I;
        static string eval()
        {
                enum name = "foo";
                enum qname = moduleName!(I)~"."~I.stringof~"."~name;
                //enum qname = I.stringof~"."~name;
                pragma(msg, "testmodule: "~qname);
                return (__traits(isFinalFunction, mixin(qname))).stringof;
        }
        enum test2 = eval();
        pragma(msg, "testmodule: isfinal: "~test2);
}


------------
note test2 fails even though it is the same code.

While this is probably a rather simple fix I would still have the problem of checking if an overloaded function is actually final rather than just the symbol name(which I guess is just the first function).

Reply via email to