On Wed, 10 Dec 2014 13:58:20 +0000 Lemonfiend via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote:
> 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 > > <digitalmars-d-learn@puremagic.com> > > 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 > >> > <digitalmars-d-learn@puremagic.com> > >> > 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.. something like this? mixin template S(alias fld) if (is(typeof(fld) == enum)) { import std.conv : to; enum s = to!string(fld); // "BAR" // or this: //import std.traits : fullyQualifiedName; //enum s = to!string(fullyQualifiedName!(fld)); // "test.Foo.BAR" } enum Foo { BAR, } void main() { mixin S!(Foo.BAR); }
signature.asc
Description: PGP signature