On Monday, May 21, 2018 14:07:45 Jacob Carlborg via Digitalmars-d wrote: > On Monday, 21 May 2018 at 00:13:26 UTC, Ethan wrote: > > Code for context: > > https://github.com/GooberMan/binderoo/blob/master/binderoo_client/d/src/ > > binderoo/util/enumoptions.d > > > > Something struck me at DConf. I was watching the dxml talk and > > hearing about all these things that weren't being implemented > > for one reason or another. And I was thinking, "But what if I > > want those things?" Being D, it'd be pretty easy to opt in to > > them with template parameters and static if controlling what > > code gets executed at runtime. > > > > But that brings up a bit of an annoying thing. Namely, the old > > school way of doing such things: > > > > class SomeObject( bool option1, bool option2, Flags iHateBools > > = Flags.Default, int > > ohIDontWantThisToBeDefaultedButRefactoringSucks = -1 ) > > { > > } > > > > Pretty obnoxious design pattern. > > > > But we're in D. We can do much better. It makes sense to do the > > following: > > > > class SomeObject( LooseOptions... ) > > { > > } > > Unless I'm missing something we can do a lot better in D : > > struct Options > { > bool foo; > bool bar; > int a; > string b; > } > > class SomeObject(Options options) > { > static if (options.foo) > { > } > } > > No magic templates or anything fancy. > > --
That's basically what dxml does except that it takes advantage of the fact that each member is a different type (because each is a differnt instance of std.typecons.Flag) so that it can have a variadic function which takes any of the arguments in any order. e.g. enum config = makeConfig(SkipComments.yes, SplitOnEmpty.yes); auto range = parseXML!config(xml); or auto range = parseXML!(makeConfig(SkipComments.yes, SplitOnEmpty.yes))(xml); http://jmdavisprog.com/docs/dxml/0.3.2/dxml_parser.html#.Config http://jmdavisprog.com/docs/dxml/0.3.2/dxml_parser.html#.makeConfig http://jmdavisprog.com/docs/dxml/0.3.2/dxml_parser.html#.parseXML - Jonathan M Davis