how to get enclosing function as symbol ? (eg: __function__.stringof ==__FUNCTION__)

Nicolas Sicard dransic at gmail.com
Sun Aug 18 00:27:05 PDT 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:
>> 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?

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...


More information about the Digitalmars-d-learn mailing list