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