On Wednesday, 10 December 2014 at 12:57:16 UTC, ketmar via
Digitalmars-d-learn wrote:
On Wed, 10 Dec 2014 12:35:44 +0000
Lemonfiend via Digitalmars-d-learn
<[email protected]>
wrote:
On Wednesday, 10 December 2014 at 12:08:34 UTC, ketmar via
Digitalmars-d-learn wrote:
> On Wed, 10 Dec 2014 11:52:11 +0000
> Lemonfiend via Digitalmars-d-learn
> <[email protected]>
> wrote:
>
>> Consider the following:
>>
>> ---
>> enum Foo { BAR, }
>>
>> mixin template S(string s_)
>> {
>> enum s = s_;
>> }
>>
>> void main()
>> {
>> mixin S!(Foo.BAR.stringof); // Error: identifier
>> 'stringof' of 'Foo.BAR.stringof' is not defined
>>
>> enum e = Foo.BAR.stringof;
>> mixin S!(e); // works fine
>> }
>> ---
>>
>> Why doesn't the first work? And is there an alternative to
>> the second version?
>
> mixin S!((Foo.BAR).stringof);
>
> sorry, don't remember the parsing rule for this.
Wow, I didn't even consider that.. Thanks!
also, you can use this:
import std.conv : to;
...
mixin S!(to!string(Foo.BAR));
people tend to forget that many `to!` variants are usable in
CTFE.
Seems like I'd want to move the converting-to-string
functionality to within the template mixin then, something like:
---
mixin template S(T, T t) if (is(T == enum))
{
//import std.traits;
//enum s = fullyQualifiedName!(t); // unfortunately this results
in "t"
import std.conv: to;
enum s = to!string(t); // this works
}
mixin S!(Foo, Foo.BAR);
---
But passing an enum as parameter seems to be somewhat annoying.
If I leave off the first Foo, then it complains about no-matching
template for int parameter.
!(Foo, Foo.BAR) seems kinda redundant..