Thread overview
take symbol as parameter
Dec 30
Marc
Dec 30
rjframe
Dec 31
Marc
Dec 31
Marc
Jan 01
Marc
December 30
how do I take a symbol as parameter?

for example:

> template nameof(alias S) {
>	import std.array : split;
>	enum nameof = S.stringof.split(".")[$-1];
>}

Works fine for say a enum member such nameof!(myEnum.X) but this:

>	struct S { int v; }
>	S s;
>	writefln(nameof!(s.v)); // should return "v"

return the following error:

> Error: template instance nameof!(v) cannot use local 'v' as parameter to > non-global template nameof(alias S)

December 30
On Sat, 30 Dec 2017 13:07:49 +0000, Marc wrote:

> how do I take a symbol as parameter?
> 
> for example:
> 
>> template nameof(alias S) {
>>	import std.array : split;
>>	enum nameof = S.stringof.split(".")[$-1];
>>}
> 
> Works fine for say a enum member such nameof!(myEnum.X) but this:
> 
>>	struct S { int v; }
>>	S s;
>>	writefln(nameof!(s.v)); // should return "v"
> 
> return the following error:
> 
>> Error: template instance nameof!(v) cannot use local 'v' as parameter
>> to > non-global template nameof(alias S)

You can use the name of the struct rather than the instance.

    writefln(nameof!(S.v));
December 31
On Saturday, 30 December 2017 at 23:30:02 UTC, rjframe wrote:
> On Sat, 30 Dec 2017 13:07:49 +0000, Marc wrote:
>
>> how do I take a symbol as parameter?
>> 
>> for example:
>> 
>>> template nameof(alias S) {
>>>	import std.array : split;
>>>	enum nameof = S.stringof.split(".")[$-1];
>>>}
>> 
>> Works fine for say a enum member such nameof!(myEnum.X) but this:
>> 
>>>	struct S { int v; }
>>>	S s;
>>>	writefln(nameof!(s.v)); // should return "v"
>> 
>> return the following error:
>> 
>>> Error: template instance nameof!(v) cannot use local 'v' as parameter
>>> to > non-global template nameof(alias S)
>
> You can use the name of the struct rather than the instance.
>
>     writefln(nameof!(S.v));

it doesn't work for me:

> Error: template instance nameof!(v) cannot use local 'v' as parameter to non-global template nameof(alias S)
December 31
On Sunday, 31 December 2017 at 22:50:12 UTC, Marc wrote:
> On Saturday, 30 December 2017 at 23:30:02 UTC, rjframe wrote:
>> On Sat, 30 Dec 2017 13:07:49 +0000, Marc wrote:
>>
>>> how do I take a symbol as parameter?
>>> 
>>> for example:
>>> 
>>>>[...]
>>> 
>>> Works fine for say a enum member such nameof!(myEnum.X) but this:
>>> 
>>>>[...]
>>> 
>>> return the following error:
>>> 
>>>> [...]
>>
>> You can use the name of the struct rather than the instance.
>>
>>     writefln(nameof!(S.v));
>
> it doesn't work for me:
>
>> Error: template instance nameof!(v) cannot use local 'v' as parameter to non-global template nameof(alias S)

Put it at global scope. Worked fine.
January 01
On Saturday, 30 December 2017 at 23:30:02 UTC, rjframe wrote:
> On Sat, 30 Dec 2017 13:07:49 +0000, Marc wrote:
>
>> how do I take a symbol as parameter?
>> 
>> for example:
>> 
>>> template nameof(alias S) {
>>>	import std.array : split;
>>>	enum nameof = S.stringof.split(".")[$-1];
>>>}
>> 
>> Works fine for say a enum member such nameof!(myEnum.X) but this:
>> 
>>>	struct S { int v; }
>>>	S s;
>>>	writefln(nameof!(s.v)); // should return "v"
>> 
>> return the following error:
>> 
>>> Error: template instance nameof!(v) cannot use local 'v' as parameter
>>> to > non-global template nameof(alias S)
>
> You can use the name of the struct rather than the instance.
>
>     writefln(nameof!(S.v));

How do I make it work when the symbol is defiend as following:

> class C { int a() { return 0; }}

call to nameof!(C.a)

give compiler error:

> Error: need 'this' for 'a' of type 'int()'
> template instance foo.nameof!(a) error instantiating