On Wednesday, 28 March 2018 at 07:45:59 UTC, Chris Katko wrote:
I have a static foreach that goes through the parameter list
and if it sees a class like "rotate", ideally, I want it to
mark a boolean "has_rotate=true"
Then simply later on, once I've parsed the list, I pick an
output path:
static if(has_rotate && has_position && has_scale)
{
//call C function al_draw_rotated_scaled_bitmap(...);
}
So I pass a bunch of "options" and then based on those options,
it picks the right function to call instead of me manually
writing
draw_fixed_centered_rotated_scaled_colored_compressed_bitmap()
manually.
The problem is, I can foreach through those parameters all just
fine... but I can't "set" a marker.
The error message makes perfect sense in retrospect:
variable has_position cannot be read at compile time
has_position isn't a static/compile-time variable. The question
is... do they exist in D? Because otherwise, I'll be going from
a really clean, elegant solution that simply passes through
each parameter, and then reacts to the combined result, and end
up with something that has to "step toward" the result, or
perhaps, test every possible permutation individually--so as to
not need variables.
D does not have compile-time variables. The way you'd generally
do what you describe is with the templates in std.meta. Instead
of something like this:
bool hasRotate= false;
static foreach (e; MyTuple) {
hasRotate |= is(e == Rotate);
}
static if (hasRotate) { // Fails, since b is a runtime
variable.
// Stuff
}
You'd be using a more functional style:
template isa(T) {
enum isa(U) = is(U == T);
}
enum hasRotate = anySatisfy!(isa!Rotate, MyTuple);
static if (hasRotate) {
// Stuff
}
--
Simen