Solución al acertijo de C++

Hace unos días planteé un problema, y como nadie lo ha resuelto, plantearé la solución. Como recordaréis, quería hacer una función que retornara el centro de un rectángulo que podría ser de tipo Gdk::Rectangle ó Pango::Rectangle, por lo que creé la siguiente función template:


template <class Rect> Rect
middleOfRect(Rect& r)
{
Rect _r;

_r.set_x(r.get_x() + r.get_width() / 2);
_r.set_y(r.get_y() + r.get_height() / 2);

return _r;
}


Y dije que tenía un problema. ¿Qué pasa si por ejemplo Rect es "const Gtk::Rectangle? El código no funcionará, porque como se ve, dentro de la función se crea un elemento de tipo Rect, que no se puede modificar. Como C++ no tiene sintaxis para referirse a un tipo «sin const» dentro de un template, la única solución que se me ocurre es modificarla de tal manera que dependa de dos argumentos, y que se retorne uno de ellos modificado:


template <class Rect1, class Rect2> void
middleOfRect(Rect1& r, Rect2& rdest)
{
rdest.set_x(r.get_x() + r.get_width() / 2);
rdest.set_y(r.get_y() + r.get_height() / 2);
}


Nótese cómo ahora la función modifica rdest, que obligatoriamente tiene que ser no-const, y que no se retorna ningún elemento; sólo se modifica el parámetro rdest.

Así, por ejemplo, podríamos tener:


Gdk::Rectangle middle;
const Gdk::Rectangle& r = element.boundingRect();

middleOfRect( r, middle );

// usar "middle" aquí


Espero que no se hagan muy pesados este tipo de entradas...

blog comments powered by Disqus