Template mixin enum stringof
Lemonfiend via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Dec 10 06:32:12 PST 2014
On Wednesday, 10 December 2014 at 14:25:30 UTC, ketmar via
Digitalmars-d-learn wrote:
> 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);
> }
Perfect, thanks.
More information about the Digitalmars-d-learn
mailing list