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);
  }

Attachment: signature.asc
Description: PGP signature

Reply via email to