digitalmars.D.learn - how to get fully qualified name of a template function (if possible at
- timotheecour (28/28) Aug 24 2012 how to get fully qualified name of a template function?
- timotheecour (9/16) Aug 24 2012 related threads:
- Ellery Newcomer (16/21) Aug 27 2012 Way back when, Don wrote some code which does just this. Recently I have...
how to get fully qualified name of a template function? In the code below I want to get "util.mod.mymethod!(double)" I tried everything (see below) to no avail, it just returns "mymethod"; The closest I get is demangle(mangledName!(fun)), which shouldn't be hard to convert to what I want, but demangle is runtime, not compile time. Ideally, fullyQualifiedName should do that, but currently fails. (btw I have a fix for another bug with fullyQualifiedName with non-templated functions which I can post shortly). ---- module util.mod; import std.stdio; import std.traits; import core.demangle; void mymethod(T)(){} void main(){ fun_aux!(mymethod!double);} void fun_aux(alias fun)(){ pragma(msg,fun); writeln(fun.stringof); writeln(__traits(identifier,fun)); writeln(__traits(identifier,__traits(parent,fun))); pragma(msg, mangledName!(fun)); writeln(demangle(mangledName!(fun))); //pragma(msg, demangle(mangledName!(fun)));//CT error:demangle is runtime //writeln(fullyQualifiedName!fun);//CT error ----
Aug 24 2012
related threads: http://www.digitalmars.com/d/archives/digitalmars/D/learn/3530.html from Don Clugston:I have implemented compile-time demangle metafunctions: static assert( prettynameof!(A) == "class main.A" ); static assert( qualifiednameof!(A) == "main.A" ); static assert( symbolnameof!(A) == "A" );And also this: http://www.digitalmars.com/d/archives/digitalmars/D/Help_with_demangling_104520.htmlFor an implementation that will demangle stuff at compile-time and allow youto get FQNs.http://www.dsource.org/projects/ddl/browser/trunk/meta/demangle.dAlthough this is old (6 y) and will probably fail with invariant,shared,__gshared,inout(the new),etc. So is there a better way now? That should be in phobos.
Aug 24 2012
On 08/24/2012 11:16 PM, timotheecour wrote:how to get fully qualified name of a template function? In the code below I want to get "util.mod.mymethod!(double)" I tried everything (see below) to no avail, it just returns "mymethod"; The closest I get is demangle(mangledName!(fun)), which shouldn't be hard to convert to what I want, but demangle is runtime, not compile time.Way back when, Don wrote some code which does just this. Recently I have been whacking with a hammer, so while you're waiting for fullyQualifiedName to not fail, you might try it. https://bitbucket.org/ariovistus/pyd/src/19bef7310180/infrastructure/meta module util.mod; import meta.Nameof; void mymethod(T)(){} void main(){ fun_aux!(mymethod!double);} void fun_aux(alias fun)(){ pragma(msg, qualifiednameof!fun); pragma(msg, prettynameof!fun); } gives util.mod.mymethod.mymethod void util.mod.mymethod!(double).mymethod()
Aug 27 2012