digitalmars.D.learn - how to get enclosing function as symbol ? (eg: __function__.stringof
- Timothee Cour (18/18) Aug 17 2013 Is there any way to get the enclosing function as symbol ?
- JS (2/20) Aug 17 2013 use a string mixin?
- Nicolas Sicard (19/42) Aug 18 2013 I thought this would work but it doesn't:
- Kapps (4/22) Aug 17 2013 I don't think you can pass it in to the function, but you can use
Is there any way to get the enclosing function as symbol ? I'd like something like that: alternative names would be: __function__ __context__ ---- auto fun(alias caller=__function__)(){ //caller represents fun1!double return ReturnType!caller.init; } T fun1(T)(T x){ assert(__function__.stringof==__FUNCTION__); alias fun=__function__; assert( is(ReturnType! __function__) == T); return fun(); } void main(){fun1!double();} ----
Aug 17 2013
On Sunday, 18 August 2013 at 01:52:50 UTC, Timothee Cour wrote:Is there any way to get the enclosing function as symbol ? I'd like something like that: alternative names would be: __function__ __context__ ---- auto fun(alias caller=__function__)(){ //caller represents fun1!double return ReturnType!caller.init; } T fun1(T)(T x){ assert(__function__.stringof==__FUNCTION__); alias fun=__function__; assert( is(ReturnType! __function__) == T); return fun(); } void main(){fun1!double();} ----use a string mixin?
Aug 17 2013
On Sunday, 18 August 2013 at 02:50:32 UTC, JS wrote:On Sunday, 18 August 2013 at 01:52:50 UTC, Timothee Cour wrote:I thought this would work but it doesn't: --- void foo(T)() { bar!__FUNCTION__(); } void bar(string Caller)() { mixin("alias caller = " ~ Caller ~ ";"); } void main() { foo!double(); } --- It works if foo isn't a template, though. The problem when foo is a template is that foo!double.foo seems to be an illegal construct for the compiler...Is there any way to get the enclosing function as symbol ? I'd like something like that: alternative names would be: __function__ __context__ ---- auto fun(alias caller=__function__)(){ //caller represents fun1!double return ReturnType!caller.init; } T fun1(T)(T x){ assert(__function__.stringof==__FUNCTION__); alias fun=__function__; assert( is(ReturnType! __function__) == T); return fun(); } void main(){fun1!double();} ----use a string mixin?
Aug 18 2013
On Sunday, 18 August 2013 at 01:52:50 UTC, Timothee Cour wrote:Is there any way to get the enclosing function as symbol ? I'd like something like that: alternative names would be: __function__ __context__ ---- auto fun(alias caller=__function__)(){ //caller represents fun1!double return ReturnType!caller.init; } T fun1(T)(T x){ assert(__function__.stringof==__FUNCTION__); alias fun=__function__; assert( is(ReturnType! __function__) == T); return fun(); } void main(){fun1!double();} ----I don't think you can pass it in to the function, but you can use __traits(parent) on a variable within the function to get the function.
Aug 17 2013