On 02/21/14 18:57, Uranuz wrote: > In my template functions, classes it's necessary to write variadic template > parameter list, where elements are options to this class/function changing > it's behaviour. But they are optional and may be not set at all. These > options may be folowed by variadic template parameter list that will be > processed in static foreach loop. What I'm thinking about is creating some > sort of key-value tuple syntax like in associative arrays. For example I > could set components or options of my template in easy-to-read manner.
You could wrap all the options in special types, as already suggested. If you don't want to do that, and only need them to affect /local/ behavior, something like this will work: class Foo(string OPTS, A...) { private static { auto _getOpts() { struct O { byte opt1; string opt2 = "def"; bool b; string[string] extra; } struct ON { mixin("enum "~OPTS~";"); } O o; foreach (N; __traits(allMembers, ON)) mixin("o. "~N~" = ON. "~N~";"); return o; } enum opts = _getOpts(); auto _getExtra(K)(K k) { if (auto p = k in opts.extra) return *p; return null; } } static if (opts.opt1>9) { /*...*/ pragma(msg, opts.opt1); } static if (opts.b && opts.opt2!="def") { /*...*/ pragma(msg, opts.opt2); } static if (_getExtra("b")) { /*...*/ pragma(msg, opts.extra["b"]); } /* handle 'A'... */ /*...*/ } void main() { alias MyFoo1 = Foo!q{opt1 = 42, opt2 = "blah", b = true, extra = ["a":"b", "b":"c"]}; alias MyFoo2 = Foo!(q{b = false}, MyFoo1, 3.14, "etc"); } Not ideal, but right now I can't think of a simpler solution, using today's D. artur