www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Generating an enum from a tuple of Types?

reply Johannes Pfau <nospam example.com> writes:
Is it possible to generate a enum from a tuple of types without string
mixins?
------------
struct S(Types...)
{
    enum Tag
    {
        //?
    }
}
------------

where the tag enum should have Types.length members. The exact names of
the enum members don't matter and could be numbered, for example:
Tag._1, Tag._2, ...

This is what I have right now, using string mixins:
http://dpaste.dzfl.pl/536e0be9

It implements a simple C-like tagged union in a generic way, so stuff
like this is possible:

-------------------------------------------
alias Value = TaggedUnion!(int, string);
auto val = Value("Hello");
auto vals = val.get!string();
val.set(0);
final switch(val.tag)
{
    case Value.tagType!int:
        break;
    case Value.tagType!string:
        break;
}
-------------------------------------------

It's basically std.variant Algebraic with less features, but it should
be much faster as it doesn't use TypeInfo.
Jan 25 2014
next sibling parent "Stanislav Blinov" <stanislav.blinov gmail.com> writes:
On Saturday, 25 January 2014 at 15:38:39 UTC, Johannes Pfau wrote:
 Is it possible to generate a enum from a tuple of types without 
 string
 mixins?
 ------------
 struct S(Types...)
 {
     enum Tag
     {
         //?
     }
 }
 ------------
Without mixins altogether... dunno. But nothing stops you from making a eponymous template :) http://dpaste.dzfl.pl/0af9dd7e
Jan 25 2014
prev sibling next sibling parent "Dicebot" <public dicebot.lv> writes:
If one wants to generate code with new identifiers, usage of 
string mixins is pretty much unavoidable.
Jan 25 2014
prev sibling parent reply Artur Skawina <art.08.09 gmail.com> writes:
On 01/25/14 16:38, Johannes Pfau wrote:
 Is it possible to generate a enum from a tuple of types without string
 mixins?
 ------------
 struct S(Types...)
 {
     enum Tag
     {
         //?
     }
 }
 ------------
 
 where the tag enum should have Types.length members. The exact names of
 the enum members don't matter and could be numbered, for example:
 Tag._1, Tag._2, ...
Well, if you don't need names then just use the index directly. Eg, see 'DiscUnion.type' in http://forum.dlang.org/thread/mtkzbwfgwsstndxbesgy forum.dlang.org#post-mailman.555.1377703234.1719.digitalmars-d-learn:40puremagic.com (A newer compiler may allow for that offset-of calculation at CT) artur
Jan 25 2014
parent Johannes Pfau <nospam example.com> writes:
Am Sat, 25 Jan 2014 18:55:54 +0100
schrieb Artur Skawina <art.08.09 gmail.com>:

 
 Well, if you don't need names then just use the index directly.
 
 Eg, see 'DiscUnion.type' in 
 
 http://forum.dlang.org/thread/mtkzbwfgwsstndxbesgy forum.dlang.org#post-mailman.555.1377703234.1719.digitalmars-d-learn:40puremagic.com
 
 (A newer compiler may allow for that offset-of calculation at CT)
 
 artur
Thanks for all the answers, I guess I'll keep the string mixin. I don't really need the names but I need the enum to support final switch.
Jan 25 2014