digitalmars.D.learn - Generating an enum from a tuple of Types?
- Johannes Pfau (33/33) Jan 25 2014 Is it possible to generate a enum from a tuple of types without string
- Stanislav Blinov (4/16) Jan 25 2014 Without mixins altogether... dunno. But nothing stops you from
- Dicebot (2/2) Jan 25 2014 If one wants to generate code with new identifiers, usage of
- Artur Skawina (6/21) Jan 25 2014 Well, if you don't need names then just use the index directly.
- Johannes Pfau (5/15) Jan 25 2014 Thanks for all the answers, I guess I'll keep the string mixin.
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
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
If one wants to generate code with new identifiers, usage of string mixins is pretty much unavoidable.
Jan 25 2014
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
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) arturThanks 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