Re: Use members of a Named Enum without using Enum name?

2015-08-15 Thread Ali Çehreli via Digitalmars-d-learn

On 08/15/2015 09:22 AM, QuizzicalFella wrote:

On Saturday, 15 August 2015 at 15:53:23 UTC, Adam D. Ruppe wrote:

On Saturday, 15 August 2015 at 15:37:42 UTC, QuizzicalFella wrote:

I'd like to be able to call someFunc(TRIANGLE) rather than
someFunc(PolygonT.TRIANGLE).


Two options come to mind:

alias TRIANGLE = PolygonT.TRIANGLE;
// etc


...if I wanted to write a mixin that iterated over all the elements in
an enum, how would I get a member to print its name without the type?
And how do I get the type to print itself?

foreach(member; enum)
 char[] output ~= alias
~member.name~=~enum.name~.~member.name~;




Fundamentally, __traits(allMembers) and .stringof but the following 
enumMembers present them as a range:


import std.stdio;

enum PolygonT : byte { TRIANGLE, RECTANGLE, STAR }

auto enumMembers(E)()
{
import std.conv : to;
import std.algorithm : map;

return [ __traits(allMembers, E) ].map!(a = a.to!string);
}

void info(E)()
{
writefln(The members of %s: %-(%s, %),
 E.stringof, enumMembers!PolygonT);
}

void main()
{
info!PolygonT();
}

Ali



Use members of a Named Enum without using Enum name?

2015-08-15 Thread QuizzicalFella via Digitalmars-d-learn
I have a named enum that I'd like to keep named, that I'd like to 
use as a type, but every time I use a member I'd rather not write 
out the enum name. I have a situation like the following:


enum PolygonT : byte { TRIANGLE, RECTANGLE, STAR }

void someFunc(PolygonT shape) { //some stuff }

I'd like to be able to call someFunc(TRIANGLE) rather than 
someFunc(PolygonT.TRIANGLE). Being clear but not being too long 
is my aim. Writing the type makes it too verbose and I have lazy 
fingers...


I don't mind if adding another enum with members of the same name 
like this:


enum CelestialBodiesT : byte { MOON, SUN, BLACK_HOLE, STAR }

...would force me to call someFunc(PolygonT.STAR) by the 
compiler, but for the case where there's no ambiguity, I don't 
want to write out the type of the enum...


I know I can add in an 'alias this' for classes and structs, but 
I think I only get one and if it's an enum I'm using all over the 
place I don't want to 'alias this' it everywhere...


Is there a way I can do this while retaining type safety? (can I 
be lazy and protected at the same time?)


Re: Use members of a Named Enum without using Enum name?

2015-08-15 Thread Adam D. Ruppe via Digitalmars-d-learn

On Saturday, 15 August 2015 at 15:37:42 UTC, QuizzicalFella wrote:
I'd like to be able to call someFunc(TRIANGLE) rather than 
someFunc(PolygonT.TRIANGLE).


Two options come to mind:

alias TRIANGLE = PolygonT.TRIANGLE;
// etc

Or at the usage site:

with(PolygonT) {
   someFunc(TRIANGLE);
}


I don't mind if adding another enum with members of the same 
name like this:


enum CelestialBodiesT : byte { MOON, SUN, BLACK_HOLE, STAR }

...would force me to call someFunc(PolygonT.STAR) by the 
compiler, but for the case where there's no ambiguity, I don't 
want to write out the type of the enum...


That'll work as long as the two enums are defined in separate 
modules, then only import the one you need to use at the time. 
Otherwise, they will conflict and it will force you to write it 
out long form again.


Re: Use members of a Named Enum without using Enum name?

2015-08-15 Thread QuizzicalFella via Digitalmars-d-learn

On Saturday, 15 August 2015 at 15:53:23 UTC, Adam D. Ruppe wrote:
On Saturday, 15 August 2015 at 15:37:42 UTC, QuizzicalFella 
wrote:
I'd like to be able to call someFunc(TRIANGLE) rather than 
someFunc(PolygonT.TRIANGLE).


Two options come to mind:

alias TRIANGLE = PolygonT.TRIANGLE;
// etc

...if I wanted to write a mixin that iterated over all the 
elements in an enum, how would I get a member to print its name 
without the type? And how do I get the type to print itself?


foreach(member; enum)
char[] output ~= alias 
~member.name~=~enum.name~.~member.name~;