I am using the CSFML D bindings, and I am creating my own draw
template function.
I first check that the object passed in is of the appropriate type, and if it is, I call the appropriate function:
template isDrawable(T) {
enum isDrawable = is(T == sfCircleShape*) || is(T == sfRectangleShape*) || is(T == sfText*) || is(T == sfSprite*);
}
void sfRenderWindowExt_draw(T)(sfRenderWindow* renderWindow, T obj) {
static assert(isDrawable!T, format("Cannot call any draw method on type %s", T.stringof));
if (is(T == sfCircleShape*)) {
renderWindow.sfRenderWindow_drawCircleShape(cast(sfCircleShape*)obj, null);
} else if (is(T == sfRectangleShape*)) {
renderWindow.sfRenderWindow_drawRectangleShape(cast(sfRectangleShape*)obj, null);
} else if (is(T == sfText*)) {
renderWindow.sfRenderWindow_drawText(cast(sfText*)obj, null);
} else if (is(T == sfSprite*)) {
renderWindow.sfRenderWindow_drawSprite(cast(sfSprite*)obj, null);
}
}
For some reason, if I replace the isDrawable
template with the following (using typeof
), the code does not compile:
template isDrawable(T) {
enum isDrawable = is(typeof(T) == sfCircleShape*) || is(typeof(T) == sfRectangleShape*) || is(typeof(T) == sfText*) || is(typeof(T) == sfSprite*);
}
This is really strange, as I assumed that the two pieces of code were essentially the same.
Any help as to why this is the case would be appreciated.