Template mixin enum stringof

ketmar via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Dec 10 06:25:20 PST 2014


On Wed, 10 Dec 2014 13:58:20 +0000
Lemonfiend via Digitalmars-d-learn <digitalmars-d-learn at 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 at 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 at 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);
  }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20141210/53a0b49c/attachment.sig>


More information about the Digitalmars-d-learn mailing list