Thread overview
take symbol as parameter
Dec 30, 2017
Marc
Dec 30, 2017
rjframe
Dec 31, 2017
Marc
Dec 31, 2017
Marc
Jan 01, 2018
Marc
December 30, 2017
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, 2017
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, 2017
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, 2017
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, 2018
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